diff --git a/contrib/tweb/CHANGES b/contrib/tweb/CHANGES new file mode 100644 index 0000000000000000000000000000000000000000..afc8fe6dc5da68349bddc002db8d7157953d9d2a --- /dev/null +++ b/contrib/tweb/CHANGES @@ -0,0 +1,200 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* CHANGES * +* * +* Function:..A short description of the last modifications of TWEB * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* September 14 1995 Z D D V V * +* Last modification: Z D D V V * +* January 15 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/*/ + + + + Changes of the web-x.500-gateway TWEB + ===================================== + +Version: tweb-2.3 1998/10/05 + +Changes to code + + - dynamic re-sort and re-display based on entries found in the DIT: + SORT definitions given by config files can be changed due to + local information within a DIT area; that provides for dynamic + definitions of sorting groups and/or display of groups with new + labels and/or other sorting order; + DISPLAY definitions can be replaced or added dynamically, in order + to display contents of entries in other than the statically + configured way + + +Version: tweb-2.2 1998/3/20 + +Changes in configuration files (please check!) + + - INDEX-URL (new): display hrefs below a certain dit showing special parts + of the entry-dn in any sequence + + - DIT-CONFIG (new): get from a specified location the information how to + switch to other gateways depending on the given dn. + With NOT-BROWSE you can turn of this functionality for browsing. + + - DISP-SEA-RDN (new): with this option you can make search-results to be + displayed only by rdn and not by relative dn to the search-base + + - TON-URLS (new): hereby you can reference a given organization/alunit + by TONS (special numbers for organizational hirarchies) + example: T013307 can mean: + computing centre, dept. development of new services + + - INDIRECT-ATTRS (new): attribute-value can be fetched by special keys from + other locations and additional be transformed by according + functions + + - ALLOW-STRING DENY-STRING GRANT REFUSE : CHANGE IN BEHAVIOUR!! + now regular expressions are used. That means you have shorter + config strings. + + - ALLOW-MSG (new): by this option you can specify a special file located + in the ETCDIRectorie containing a message to be displayed + in case of an allowed access to TWEB + + - TABLES (new): triggered by the presence of a special objectclass + will be displayed a button in the header of the TWEB-page + allowing an eXtended data access such as: + a table with names, telephonenumbers and e-mail addresses + of the current organization + + or the access to the electronic telephonebook-data + of the university of tuebingen generated by TWEB + dynamically + + +Version: tweb-2.0a 1997/1/7 + +Changes in configuration files (please check!) + + - PULL-DOWN-MENUS (new): use BUTTONS and PULL-DOWN-MENUS instead of links + in order to support: help, language-switch, move-upwards + and read-entry functionalities + + - GRANT (new): allow general access to TWEB for specified locations + ( same syntax as ALLOW-STRING ) + + - REFUSE (new): refuse general access to TWEB for specified locations + ( same syntax as DENY-STRING ) + + - INDIRECT-ATTRS (new): Get specified attribute-values from another + location + + - CACHING-TERMS (new): specify caching-behaviour for browsers and www-caches + + - CACHE-EXPIRE-DEFAULT (new): set a default caching-time for browsers + and www-caches + + - SHOW-DEFOC (new): Show Default Objectclass + + - COMREFUSE (new): prevent engine-access + + - robots.txt (new): supply robots.txt-file functionality with the same + behaviour as in www-servers + + +Version: tweb-1.1b 1996/5/7 + +Changes in configuration files (please check!) + + - STRICT-BASEDN (new): Access not below basedn is switched to responsible + gateway ( -> gw-switch) + + - ALLOW-PROXY (new): if NO-PROXY is configured access from + given domain is allowed + + +Version: tweb-1.1a, 1996/4/25 + +Changes in configuration files (please check!) + + - SORT extensions: fourth parameter RELATED DISPLAY-CLASS: + relation to according DISPLAY-entry + (default is 'default') + see DISPLAY changes + + fifth parameter SORT-ATTRIBUTE: + attribute used to sort entries + (default is 'sn') + + - DISPLAY changes: The DISPLAY objectClass entry is replaced by the string + that is used as fifth attribute with SORT + + - NO-PROXY (new): option for access restrictions via PROXY-servers + + - TWEBHOST (new): option to support a constant tweb-hostname + + - NO-MODIFY (new): option to prevent entries with named objectclasses from + modification + + - PGPKEY (new): DISPLAY-TYPE for PGPKeys enabling cut&paste + + + Changes to code + + - conversion from upper to lowercase characters in: + make_oc_to_str(), pick_oc(), init_sort(), init_modify(), + attrs in display() and all internal comparison-strings!!! + + - modification with multiline attributes now possible with NETSCAPE + + - pictures in X.500 are shown (only with NETSCAPE) + + - display is denied in do_read() in case of missing default-Display + + - technical entries (gw...) are not shown if using DYNAMIC-GW + + - the tokens to filter proxy-access with NO_PROXY are extended to: + " via " & "Proxy gateway" + + - the tweb-version and compilation date is now shown with C & K options + + - many bugfixes + + +Version: tweb-1.0b, 1996/2/29 + + Changes in configuration files (please check!) + + - ALLOW/DENY-String moved from tweb.conf.[01] to tweb.rc + - tweb.lang.[01]: string 4 TEXT/HTML --> text/html + - tweb.rc : optional parameter TWEBHOST (see FEATURE-LIST) + + Changes to code + + - better behaviour in modify operations + BEWARE: modification of inherited attributes still NOT possible (!) + + - logging-option (-l) with facultative parameter: LOCAL[0-7] of syslogd + + -lx --> LOCAL3 (default) + + - simplified metasyntax of GW-switches: + + labeledURI= http://<host>:<port>/ <descriptive string> (gw[-<lang>]) + + - use 'aliasedObjectName' in HREF of aliases + - always print HTML header + - many bugfixes + + +Version: tweb-1.0a, 1996/2/7 + + - base distibution + diff --git a/contrib/tweb/COPYRIGHTS b/contrib/tweb/COPYRIGHTS new file mode 100644 index 0000000000000000000000000000000000000000..6b5f68d69084d05b0571b4f61ca3a32bc90a735f --- /dev/null +++ b/contrib/tweb/COPYRIGHTS @@ -0,0 +1,101 @@ +Copyright (c) 1994 - 1999 University of Tuebingen, Germany. +Written by Kurt Spanier and Bernhard Winkler. All rights reserved. + +This software is not subject to any license of the University of +Tuebingen, Germany. + +Permission is granted to anyone to use this software for any purpose +on any computer system, and to alter it and redistribute it, subject +to the following restrictions: + +1. The author is not responsible for the consequences of use of this + software, no matter how awful, even if they arise from flaws in it. + +2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. Since few users ever read sources, + credits should appear in the documentation. + +3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. Since few users + ever read sources, credits should appear in the documentation. + +4. This notice may not be removed or altered. + + + +This work is derived from the Technical University of Chemnitz web500gw +by Frank Richter. Information concerning is available at + http://www.tu-chemnitz.de/~fri/web500gw. + +web500gw is itself derived from the University of Michigan go500gw +by Tim Howes. Information concerning is available at + http://www.umich.edu/~dirsvcs/ldap/ldap.html + +This work also contains materials derived from public sources: + + ch_malloc.c, charray.c, dn.c from the University of Michigan LDAPv3.3, + with some minor bug fixes. + + regular.c from the University of Toronto regexp by Henry Spencer, + with renaming of functions for not colliding with putative + build-in regexp functions in the underlying LDAP libraries, + as well as minor modifications. + The original software can be obtained from + ftp://ftp.cs.toronto.edu/pub/regexp.README, and + ftp://ftp.cs.toronto.edu/pub/regexp.shar.Z + + +Additional Information can be obtained by sending e-mail to: + tweb-support@mail500.uni-tuebingen.de + + +--- + +Portions Copyright (c) 1994-1998 Chemnitz University of Technology. +All rights reserved. + + A LDAP based WWW - X.500 gateway + + written by: Frank Richter, Frank.Richter@hrz.tu-chemnitz.de + Chemnitz University of Technology, Germany, 1994-1998 + + Redistribution and use in source and binary forms are permitted + provided that this notice is preserved and that due credit is given + to the Technical University of Chemnitz. The name of the University + may not be used to endorse or promote products derived from this + software without specific prior written permission. This software + is provided ``as is'' without express or implied warranty. + + +--- + +Portions Copyright (c) 1992-1996 Regents of the University of Michigan. +All rights reserved. + + Redistribution and use in source and binary forms are permitted + provided that this notice is preserved and that due credit is given + to the University of Michigan at Ann Arbor. The name of the University + may not be used to endorse or promote products derived from this + software without specific prior written permission. This software + is provided ``as is'' without express or implied warranty. + + +--- + +Portions Copyright (c) 1986 by University of Toronto. + Written by Henry Spencer. Not derived from licensed software. + + Permission is granted to anyone to use this software for any + purpose on any computer system, and to redistribute it freely, + subject to the following restrictions: + + 1. The author is not responsible for the consequences of use of + this software, no matter how awful, even if they arise + from defects in it. + + 2. The origin of this software must not be misrepresented, either + by explicit claim or by omission. + + 3. Altered versions must be plainly marked as such, and must not + be misrepresented as being the original software. + diff --git a/contrib/tweb/FEATURE-LIST b/contrib/tweb/FEATURE-LIST new file mode 100644 index 0000000000000000000000000000000000000000..9e338626fb3831858df0a89bb36c2ba081f790ed --- /dev/null +++ b/contrib/tweb/FEATURE-LIST @@ -0,0 +1,1138 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* FEATURE-LIST * +* * +* Function:..A description of the basic of TWEB, * +* the Tuebinger Web-X.500 gateway * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* September 14 1995 Z D D V V * +* Last modification: Z D D V V * +* January 15 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/*/ + + + +0 TABLE OF CONTENTS + + 1 Introduction + 2 General overview + 2.1 A case of Public Relations + 2.2 Configuration files and TWEB start-up + 2.3 The running gateway + 2.4 check4access: who is allowed to see (what) data + 2.5 Preparing the data + 2.6 Searching for data + 2.7 Data based behaviour: the dynamic gateway + 2.8 Restricting the service + 2.8.1 Restricting the number of entries + 2.8.2 Suppression of certain entries by RDN + 2.8.3 Defining DIT areas for search-only operations + 2.8.4 Controlling the hackers + 3 Configuration of TWEB features in detail + 3.1 Technical configuration options + 3.2 Political configuration options + 3.3 Load balancing configuration options + 3.4 Display configuration options + 4 Support and discussion list + + +1 INTRODUCTION + + TWEB is based on the Web500gw implementation by Frank Richter, + Technische Universitaet Chemnitz-Zwickau, which is based on the + go500gw implementation by Tim Howes, University of Michigan. + + TWEB was compiled and tested on LINUX with cc, HPUX 9.05 with the + HP-ANSI C compiler, as well as SunOS 4.1.2 with the SUN C compiler. + TWEB was also compiled with gcc on all platforms. On SUN Solaris + 2.6.x TWEB was also compiled with gcc 2.7.2. + + The UMICH LDAP client library version 3.0 or 3.3 + ( URL:ftp://terminator.rs.itd.umich.edu/ldap/ldap-3.3.tar.Z ) + must be installed on the machine (library path and include file + path is configured in Makefile). With QUIPU ICR-2.x the ISODE- + provided LDAP libraries should be used. As such, TWEB only supports + LDAP version 2 with the University of Michigan type C API. TWEB is + also adapted for the OpenLDAP LDAP library, release version 1.1.2 + (http://www.openldap.org). + + An upgrade to LDAP version 3 and a C API standadized by the IETF + is planned for a not so far away future, most probably in step + with the OpenLDAP package. + + TWEB, as provided here is a fully functional core gateway, which + is extended at the author's site by some local features. These + extensions are included into the same code base, so that some + "#ifdef TUE_TEL" or "#ifdef AMBIX" pre-processor statements can + be found throughout the code. + + +2 GENERAL OVERVIEW + +2.1 A case of Public Relations + + TWEB is a gateway between the HTML-based World-Wide-Web (WWW + for short) and the X.500-based wordlwide directory, nowadays + mainly accessed through LDAP, the Leightweight Directory Access + Protocoll. As such, TWEB is a mediator between these worlds, + providing run-time access to a lively database and preparing + results in a usable format. + + Why not access the directory directly via my browser-built-in + LDAP functionality, you may ask. One answer is, that TWEB with + it's build-in security features may provide access to more + internal data for permitted users, while denying these data for + outside users. This might be very handy from the database + administration point of view, easing the task of checking + for consistencies between seperate inside and outside databases. + + Secondly, TWEB provides for a flexible display of results, + not just showing the pure data. Corporate identity, even when + using a staff's directory, can be implemented by an organization. + Furtheron, important messages and hints can be added on the fly, + that are relevant to the directory user. This is also possible + via HTTP links, provided either through the directory data (e.g., + links to personal home pages) or embeded into HTML text loaded + during result page preparation. Thus, the integration of WWW and + the directory can be two-ways, not just one-way. + + Thirdly, TWEB can, with some extensions not yet provided in + the current distribution, easily be configured to access the + directory more than once, in order to return results for a + single request. For example, this can be used to build a page + with the phoenbook entries of a whole department, institute, or + faculty, spanning many hierarchies is the underlying directory + database, as implemented at the University of Tuebingen. + + When running TWEB with some of the configuration options, one + might easily find more points that are in favor of a gateway + solution, rather than purely accessing the data of a single + directory entry at a time. + + BUT AFTER THIS SHORT EXCURSION INTO THE WORLD OF PR, LET'S + HAVE A LOOK AT WHAT TWEB PROVIDES AND WHAT FEATURES CAN + BE USED. + + +2.2 Configuration files and TWEB start-up + + Allmost anything what TWEB provides is determined by a set of + configuration files during start-up, or at run-time. There is + the main ressource file (tweb.rc) that provides for basic, + language-independant features, like host and port of the connected + directory server. Language-specific configuration parameters + are located in the config files (tweb.conf.x), with x (0-9) + standing for any of a set of supported languages. Language + strings, that are used to build an HTML result page are taken + from the language files (tweb.lang.x), again with x indicating + the language in question. Those files are located in the + TWEB_conFiles subdirectory; the TWEB binary, probably via a + symbolic link, should also reside within that directory. + + Header and footer files, and certain message files are loaded + during run-time, so that the content can be updated on-the-fly, + without restarting the gateway. Those files can be found in the + LDAP_etc subdirectory, but can also be located elsewhere, after + setting the ETCDIR parameter in the tweb.rc file. + + Certain configuration parameters can be overridden by command + line parameters during start-up. Type 'tweb -h' to get a short + description of each command line parameter, or have a look at + the description below. The important parameters are '-l' for + selection of the LOCAL user of the syslog facility, and '-L' + for selection of languages. + + When starting, TWEB first of all determines which languages should + be supported. A sub-process is created for each language by the + fork() system call, and the starting process is terminated. (In case + of only one language, TWEB will not fork, but instead use the first + process for the gateway service.) Each sub-process is responsible for + one of the languages, and presents hyperlinks to the other languages' + HTTP addresses on HTML pages, so that the user can switch from one + language to the other. When language hints are provided within the + directory data (see below) even attribute values may be presented + language-specific. (This is not to be mixed up with the LDAPv3 + standard, which provides for language specification via attribute + options.) + + The starting TWEB initializes itself by reading the tweb.rc, the + tweb.conf.x, and the tweb.lang.x files, and stores the configuration + in a global data structure that can be used by all parts of the + program. Command line options are considered last, and can override + previously defined parameters. In the tweb.rc and tweb.conf.x files + parameters are generally additive, meaning that configuration can be + spread across those files (e.g., GW-SWITCH can be set to language- + independant gateways in tweb.rc and extended by language-specific + gateways in the tweb.conf.x files.) + + Also, message, header and footer files are checked for presence, and + a warning is printed to standard output, if they are missing. After + some more sanity checks of the configuration, TWEB connects to the + port it was configured for and starts listening for HTTP requests. + (In the tweb.rc config file only a base port is given; the gateway + process serving for language 0 will listen at this port; the gateway + for language 1 at port+1, for language 2 at port+2, and so on, upto + the language with number 9.) + + +2.3 The running gateway + + When a request is started by an external HTTP client, TWEB checks + for access rights of that client (see below), and decides, whether + the request can be handled by the process itself (mainly simple + requests, like, e.g., sending the help file), or whether another + sub-process should be started. In both cases the TWEB master process + returns to listening for requests, so that new request can be + handled while old ones are still in progress. + + A request is encoded into the URL, the Universial Ressource Locater, + the HTTP client sends to the gateway process. Such an URL is build + of different parts, as follows: + + http://host:port/request + + First of all, 'http://' defines the HTTP protocoll itself. As + TWEB is the mediator between WWW and the directory, it is an HTTP + server towards the browser, accepting normal HTTP request, but is an + LDAP client towards the directory server, sending LDAP requests. + + Host and port are the same as in the tweb.rc configuration file, + and tell the browser, where to direct the request. + + The request for TWEB is given in the last part of the URL, in a more + or less complicated format. The most simple request is the EMPTY + request ( http://host:port/ ), which will cause TWEB to return a + listing of directory entries just below it's BASEDN. (Besides beeing + the "home" for TWEB when sending an URL without further specification, + the BASEDN can also be configured as beeing the root entry of an DIT + area, and TWEB will only serve requests within, but not outside that + area; STRICT-BASEDN.) + + All other requests are given by a starting letter (beware: that + letter is CASE-SENSITIVE) and possibly a further specification. + That letter directs TWEB to one of several actions, like returning + a directory listing, reading a specified entry, or sending a + formular for modification of an entry. If a directory look-up + is necessary, TWEB will perform that via LDAP, prepare the results + as an HTML page, and return it to the requesting client. After + that the process will die, unless it was the master process, that + returns to listening for further requests. Thus, TWEB's action is + as state-less as the HTTP protocoll itself, but some information + for subsequent client requests can be embedded into the result, + like for example a gateway-switch (see below) or an entries' old + data in a modification formular. + + Like in HTTP, the TWEB request URL should contain no space characters, + and certain special chars should be HTML escaped. TWEB will allways + prepare such URLs in its own results, e.g., when returning a list of + entries, with each one beeing a clickable hyperlink for the next data + retrieval. Thus, during interaction with TWEB, the user has not to + consider such special characters, for they are converted automatically. + Only the very first link to TWEB, be it embedded into a web page, or + entered directly into the browser's 'goto URL' field, or whatever it is + called, should be checked for those characters. + + +2.4 check4access: who is allowed to see (what) data + + A requesting client not only gives the URL to TWEB, but also it's + IP or Internet address. This is an address needed by computers to + find each other in the world-wide network. Normally, computers + have also so-called Internet Names, that are more human-readable. + To match IP addresses and internet names, the Domain Name Service + (DNS) is run on the Internet. When TWEB receives an IP adress, + it will try to look up the corresponding internet name of the + requesting client and use that information to decide on access + rights of the client. If a host's name cannot be found in the + DNS, this is also used as a bit of information. The configuration + parameters GRANT, REFUSE, ALLOW-STRING, and DENY-STRING can be + set to specify access rights based on internet names in a very + flexible way. Furtheron, the HTTP information of proxy access + is considered, if the parameters NO-PROXY and ALLOW-PROXY are set. + + When TWEB has decided on access rights, it will continue depending + on these rights. When service is totally refused to a requesting + host, or a complete IP domain, a corresponding message is send to + the client and the TWEB process terminates. Otherwise, TWEB selects + one of two configured WEBDNs (the directory names of corresponding + entries in the local directory) and WEBPWs (corresponding passwords) + and sends the LDAP requests with these DNs to the directory server. + The server should of course be configured in a way, that the one DN + has access to internal data, whereas the other has not. Thus, data + retrieval can be controlled by the server, not only by TWEB itself. + + +2.5 Preparing the data + + Almost any result page is build by combining different areas, as + appropriate for the result returned. A header and footer is located + at the top and the bottom of the HTML page, respectively. (In fact, + the footer is followed by a tiny TWEB version info, so the footer + is only the second-last element.) Below the header some internal + message can follow (ALLOW-MESSAGE), which will not be shown to an + outside requestor, and in front of the footer there can be a Legal + Message for the outsider (LEGAL; actually, if the ON-TOP parameter + is specified for the LEGAL option, this Legal Message will also be + printed at the beginning of the result page). Below the header/ + internal message, an area for navigation, reading the current base + position and a search box may follow, that can be used for entering + further requests. Below that, the results of the current request + are shown. + + If there are more than one result entries to the current request (e.g., + due to a listing of entries below the current DIT position, or multiple + matches for a search request), a hyperlink for each entry is displayed, + to give the user the possibility to follow the link and obtain the + results for the next request. The HREF within the hyperlink is a + complete URL, with host:port, and the directory entries' distinguished + name (DN) for the next request to TWEB. + + Results can be grouped to different lists and sorted within each + group, according to the settings of the SORT configuration parameter, + and the entries' objectclasses. The objectclasses given in the SORT + configuration parameter are scanned for in each result entry, + sequentially, and an entry is placed into the appropriate group, as + soon as an objectclass is found. (Entries having none of the SORT + objectclasses will only be shown, if the SHOW-DEFOC configuration + parameter as well as a DEFAULT DISPLAY-TYPE is given.) After scanning + for groups, each group of entries is sorted according to the contents + of the sort attribute listed within the group's SORT clause, or by the + attribute "sn" (surname), if no explicite sort attribute is given, or + according to the entries' relative distinguished name, if there is no + sn attribute within the entries. The sorted groups are displayed in + the order, that is given numerically in the SORT clauses. Thus, the + order while scanning for objectclasses (i.e., preparing the groups) + is distinct from the order during display. Each group is prepanded + by the label given in the SORT clause, with a label consisting only + of space characters meaning no label. (Labels containing space + characters must be surrounded by double quote characters, i.e., '"'.) + + If there is only one result to a request, TWEB will perform a read + request for the X.500 entry and display the attributes of the entry. + Since access rights are also checked at the server (see above), the + attribute list for a permitted user can differ from the list of an + external user. In each case, the attributes are sorted according to + the DISPLAY-OBJECT given in the SORT configuration parameter, after + classification of the entry to one of the SORT groups in much the + same way, as described above. The DISPLAY-OBJECT selects the attributes + to be displayed and determines the order of, as well as labels for + the attributes. (If the DISPLAY-OBJECT parameter is not given to the + SORT configuration option, DISPLAY-OBJECT DEFAULT will be used; if + that, however, is not given by the configuration files, the entry + will NOT be displayed!) The method for displaying is also given. Thus, + attributes can be displayed as simple strings, prepared as HTTP URLs, + or as mailto hyperlinks. A complete list of display methods is given + below with the description of the FIRST-PAGE configuration parameter. + Within the DISPLAY-OBJECT definition, FIRST-PAGE describes attributes + to be shown on a first HTML page, and SECOND-PAGE lists attributes + for a second HTML page, if given. To obtain the second page, a hyper- + link that directs TWEB to read the same entry again with additional + attributes, is placed at the end of the first page's attribute list. + + +2.6 Searching for data + + As described above, one element of a result page may be a search box + that can be used to enter appropriate search strings. The input is + taken by TWEB and used according to the definitions of the + ldapfilter.conf file (a basic version is located in the LDAP_etc + sub directory.) In that file, rather complicated search algorithms + can be defined, but the most simple ones will be to look for cn or + sn attributes. By default, the search scope is restricted to one + level below the current DIT position, unless the base entry (the + current position) containes objectclasses 'organization' or + 'organizationalUnit'. In this case, the search will cover the whole + DIT area rooted at the current position. (Subtree search.) This + scope also determines which search rules are taken from the + ldapfilter.conf file. (Look for "web500gw onelevel" and "web500gw + subtree".) + + One word for a warning: since TWEB is currently based on LDAPv2 and + servers that are NOT aware of special characters, like german umlaute, + such characters should NOT be entered to the search box. Depending + on the server's implementation and configuration, these characters + might crash the server, since they are not one of the expected ASCII + characters. TWEB, on the other hand, can hardly figure out the + character entered because of differrent code tables in use with + the browsers and the platforms housing TWEB itself. If someone has + a simple sollution to the latter problem, the authers would welcome + a hint, so they could implement a safe character conversion method. + + +2.7 Data based behaviour: the dynamic gateway + + In the 'preparing data' section, the construction of hyperlinks for + further requests was described for situations, when more than one + entry matches the previous request. For these hyperlinks, the under- + lying URL will normally contain the TWEB's own host and port address, + so that requests will be directed towards the same gateway. This, + however, can be modified by a feature called "gateway-switching", + directing further requests to other gateways. + + Gateway-switching exists in two flavors: static (via the GW-SWITCH + configuration option) and dynamic (selected by the configuration + option DYNAMIC-GW) due to data contents. In both cases, a new host + and corresponding port address is inserted into the URL of a hyperlink. + + Static gateway-switching is performed, if a DN given in the configu- + ration file, or an entry below that DN, is referred to in the hyperlink. + In that case, the beginning of the URL is taken from the configuration + file and the DN of the referred-to X.500 entry is appended. Like other + configuration options, GW-SWITCH in the tweb.rc file will refer to one + such external gateway for all TWEB languages, whereas GW-SWITCH in the + tweb.conf.x files will be language-specific. + + When the configuration option DYNAMIC-GW is given, TWEB will scan each + entry to be referred to, for the presence of a so-called gateway- + switch-URL. For the time beeing, this is encoded in the attribute + "labeledURI", with the value having a special syntax. Normal syntax + is an URL of the from "http://host/ label". With the gateway-switching + option, this format is extended to "http://host:port/ label (gw)", + for a language-independant switch, and "http://host:port/ label (gw-xx)", + for a languager-specific switch. The "xx" has to be replaced by the + international 2-letter language tag, as defined in ISO 639, "Code for + the representation of names of languages" (see also RFC-1766). Thus, + "gw-de" means "german language", "gw-en" means "english", "gw-fr" + means "frensh". When displaying the contents of a labeledURI attribute, + TWEB will suppress values that follow the above syntax. For performance + reasons, searching of entries, as well as listing entries below the + current position (i.e., browsing through the directory), will allways + include look-up of the labeledURI and other attributes. + + If both static and dynamic gateway-switching are active, the dynamic + switch will be considerred first; if no gateway-switch URL, first testing + for a language-specific one, than testing for an independant one, is + found within an entry, static switching is tested, again the specific + case prior to the un-specific. + + The most prominent usage of the gateway-switching feature is to direct + requests for other organizations' data within a country (or for sub- + organizations within one organization) to specific gateways, thus + giving the option to implement a Corporate Identity for each organi- + zation via organization-specific header and footer files. Beside that, + of course, specific access policies can be implemented by each orga- + nization, and network traffic is reduced by accessing an organization's + data directly with a HTTP browser, not via an intermittant gateway + and X.500 server of another organization. This latter point may also + mean a much reduced response time, when unnecessary data transfers are + ommited. + + +2.8 Restricting the service + + A number of configuration options can be used to restrict the display + of certain information, or to deny service totally for certain users. + These options are described in the following sub-chapters. + +2.8.1 Restricting the number of entries + + Normally, an X.500 server will have an option "sizelimit" set to + some small or medium value, e.g., 100 or 500. This sizelimit will + prevent the number of entries returned for any one request, to + exceed that number. This is mainly set by the server's administrator + to reduce system and network load. + + When displaying all entries returned from the server, TWEB might + produce a very large HTML file. That file may take some time for + transfer, and may be very un-handy, because of the long list of + entries. + + To prevent the possibiloty of such large files, the TWEB administrator + can reduce the number of entries displayed even further, by use of + the MAXCOUNT configuration option. This will reduce the number of + ALL entries returned from the server. + + If this restriction should only apply to person's entries, the + configuration option MAX-PERSON can be used. This option will + apply to each sub list of person's entries seperately. Thus, the + total number of persons may exceed the MAX-PERSON limit, if more + sub lists containing person's entries are given. + + Each restriction of the number of entries to be displayed, will + lead to a random list of entries, cutting the results as soon as + the maximum count is reached. However, rhis is also true for the + sizelimit option at the server itself. + +2.8.2 Suppression of certain entries by RDN + + The server's access control rules will normally define, which entries + can be obtained by the TWEB gateway. In some situations, the TWEB + administrator might want to suppress even more entries, e.g., DSA + entries or other mere technical ones. (This can also mean, that + complete DIT areas could be hided from the user.) + + To invoke that, the configuration option NO-SHOW-RDN can be defined + to reflect a space-seperated collection of RDNs, or parts of RDNs, + which will not be shown to the user. This, of course, is a very + crude method, but normally will give the results, the TWEB admin + may be interested in. + +2.8.3 Defining DIT areas for search-only operations + + As described allready in the "Restricting the number of entries" + section, large lists of entries may be cumbersome to read, if at + all they are returned completely by the server. To exclude the + possibility of such partial, or ultra-long lists, TWEB can be + configured to display the search box only at certain DIT positions. + This is done via the SEARCH-ONLY configuration option, which defines + the DIT area(s) for this restriction, as well as certain message + files, which should explain the local restriction to the user, and + tell him, how to find the information, he is looking for. The + SEARCH-ONLY configuration option will only take effect, when + browsing the directory, but not prevent a normal subtree search. + + This configuration option, of course, can also be used to implement + certain access policies. The option will be active for both the + internal and the external user. + +2.8.4 Controlling the hackers + + From time to time, users will direct tools to the world-wide-web, + that will screen through all, what is supplied in the system. This + tools are known as robots, or crawles, and normally the collect data + to build indices for faster information retrieval. + + Sometimes, however, these tools can be very ugly, especially, when + they try to collect data as fast as possible. This might cause + severe performance decrease, preventing other users to get data + at all. In order to have some mechanisms against this type of + data harvest, TWEB can be configured with the COMREFUSE option + activated, which will control the number of accesses to the gate- + way by a certain number of IP ranges within a selected time-slice. + + Those IP ranges are constructed by reducing the requesting host's + 32-bit Internet address to a 13-bit number, thus giving 8192 + different IP ranges. Each IP range is controlled seperately during + a pre-set time-slice, and each IP range can be excluded from + further service (returning an appropriate error message), when + a pre-set number of accesses is reached within that time-slice. + All hosts of that IP range are suspended from TWEB's service for + a number of time-slices, and resumed for service afterwards. + + +3 Configuration of TWEB features in detail + + Runtime configuration is provided by the files tweb.rc (general + configuration) and tweb.conf.x (language-specific configuration). + For each supported language there must be a tweb.conf.x and + tweb.lang.x file, with 0 <= x <= 9. + + Remark: most of the features are best configured in the files as given + below, but there may be situations, where transfer, or even + splitting to other configuration files could be used, e.g., + static gateway-switching may be configured in tweb.rc listing + organizations which support only one gateway, whereas organi- + zations supporting different language-specific gateways may be + configured in the appropriate tweb.conf.x files; the resulting + gw-switch list will contain all organizations, regardless of the + originating files. + + In order to keep off WWW robots from blocking the gateway put + a file with name robots.txt into the directory, together with + the tweb binary, containing the following: + + # go away + User-agent: * + Disallow: / + + This is the same behaviour as if there were a www-server with a + corresponding public directory containing the file robots.txt. + + + The following sections will list TWEB's configuration options. + (See also the example configuration files.) + + +3.1 Technical configuration options + + This section lists options, which define the technical parameters of + TWEB's operation. Most of them are located in the tweb.rc configuration + file, but some could also go into the tweb.conf.x files. + + LDAPD -- The host running the LDAP daemon + ( usually located in tweb.rc ) + + example: LDAPD x500.zdv.uni-tuebingen.de + + LDAPPORT -- The port the LDAP daemon is listening on + ( usually located in tweb.rc ) + + example: LDAPPORT 389 + + WEBPORT -- The base port the gateway is attached to + (the language-specific offset x is added + to this number for every running GW) + ( usually located in tweb.rc ) + + example: WEBPORT 7000 + + TIMEOUT -- Timeout in seconds for any one LDAP + operation + ( usually located in tweb.rc ) + + example: TIMEOUT 240 + + ETCDIR -- The directory containing support files + (help files, header/footer files ...) + ( usually located in tweb.rc ) + + example: ETCDIR ./LDAP_etc/ + + FILTERFILE -- The LDAP filterfile + ( usually located in tweb.rc ) + + example: FILTERFILE ldapfilter.conf + + BASEDN -- The default starting point of DIB access, when + no other directory position is given + At this position, optional header and footer + information (HTML code in file) can be displayed + ( usually located in tweb.conf.x ) + + example: BASEDN "o=Universitaet Tuebingen, c=DE" + tweb-base.head.0 tweb-base.foot.0 + + HELPFILE -- Name and path of the help-file + ( usually located in tweb.conf.x ) + + example: HELPFILE tweb.help.0 + + FRIENDLYFILE -- Name and path of the friendly-file + ( usually located in tweb.conf.x ) + + example: FRIENDLYFILE ldapfriendly.0 + + HEADER/FOOTER -- General header/footer information displayed on + every HTML-page, except when other headers/footers + apply + ( usually located in tweb.conf.x ) + + example: HEADER tweb.header.0 + FOOTER tweb.footer.0 + + ALLOW-MSG -- Option to specify a special file located in the + ETCDIRectory containing a message to be displayed + in case of an allowed access to TWEB + (see next section) + ( usually located in tweb.conf ) + + example: ALLOW-MSG allow.msg.0 + + +3.2 Political configuration options + + This section lists options to implement a certain access policy with the + TWEB web-X.500 gateway, or to alter the behaviour of the gateway when + displaying data from certain DIT areas. + + WEBDN -- The DN of a technical webgw X.500 entry, + which is used for a permitted (internal) user + (for logging AND access control) + ( usually located in tweb.rc ) + + example: WEBDN "cn=TWEB-quickie-intern, + ou=SERVICES, o=Universitaet + Tuebingen, c=DE" + + WEBPW -- The Password in the WEBDN entry + ( usually located in tweb.rc ) + + example: WEBPW password4quickie-intern + + WEBDN2* -- The DN of a technical webgw X.500 entry, + which is used for a not-permitted (external) user + (for logging AND access control) + ( usually located in tweb.rc ) + + example: WEBDN2 cn=TWEB-quickie-extern, + ou=SERVICES, o=Universitaet + Tuebingen, c=DE" + + WEBPW2* -- The Password in the WEBDN2 entry + ( usually located in tweb.rc ) + + example: WEBPW2 password4quickie-extern + + * setting WEBDN2 as well as WEBPW2 to real values is useful, + if the X.500 service in the background is also used by other + directory user agents; in this case, a clean distinction, + even on the ACL level, can be made between TWEB and those + other DUAs. + To fully exploit the feature of two different WEBDNs the + DSA must support an ACL policy, which can reduce access + rights for a specified DN, while at the same time defining + broader access rights for a group of other DN, which may + also include the specific DN; such a behaviour is NOT + implemented in Isode's QUIPU 2.x DSA; a patch introducing + such a policy was developped at the University of Tuebingen + for QUIPU 2.2v4, and can be optained seperately. + Slapd stand-alone LDAP servers implement a different ACL + mechanism and can be configured more easily by use of the + first matching access-rule in the slapd.conf configuration file + + GRANT** -- A string describing IP domains allowed to access + the gateway + ( usually located in tweb.rc ) + + example: GRANT (www9|mog|x500server|meal) + \.zdv\.uni-tuebingen\.de$| + (abcde01|xyz)\.modem\.org\.de$ + + REFUSE** -- A string describing IP domains refused to access + the gateway + ( usually located in tweb.rc ) + + example: REFUSE hackhost\.(org1\.)?uni-xyz\.de$ + + ALLOW-STRING** -- A string describing IP domains allowed to + access the DIB authorized by WEBDN (see above) + example: "\.de$|\.us$|\.edu$" + ==> host of domains de, us and edu will + have authorized access to the DSA, others NOT + ( usually located in tweb.rc ) + + example: ALLOW-STRING uni-tuebingen\.de$ + + DENY-STRING** -- The opposite of ALLOW-STRING. Here, access for + subsets of the ALLOW-STRING may be reduced. + ( usually located in tweb.rc ) + + example: DENY-STRING not\.secure\.host + \.uni-tuebingen\.de$ + + ** GRANT/REFUSE are considered first to decide, whether the + requesting host will be served at all; only hosts granted + the service will be checked against ALLOW-STRING/DENY-STRING + to classify as internal or external user (hence, giving + WEBDN or WEBDN2 as the DN during X.500 look-up); + both, GRANT and ALLOW-STRING are used as positive-lists, + whereas REFUSE and DENY-STRING are used as negative-lists; + if the positive-lists are defined, and the requesting host's + IP domain is NOT covered by the list's description, the + host is considered as not-permitted; only when the host + is accepted by the positive-list, the negative-list will + be considered to decide on a more specific exclusion of + the host's IP domain; + if the positive-lists are not defined, each host will be + accepted, as if contained within the list; if the negative- + lists are not defined, each host will be accepted, as if + NOT contained within the list; + hosts NOT found in the Domain Name Service (DNS) will be + granted access, but will NEVER have authorized access + via WEBDN + + TWEBHOST -- Supplies a constant hostname in the returned URL + of HTTP links independant from the local one + ( usually located in tweb.rc ) + + example: TWEBHOST x500.zdv.uni-tuebingen.de + + NO-PROXY -- Access restrictions for WWW-PROXY-Servers + ( usually located in tweb.rc ) + + example: NO-PROXY + + ALLOW-PROXY -- if NO-PROXY is configured + access from a given set of proxy-hosts + ('host1:host2') is allowed + ( usually located in tweb.rc ) + + example: ALLOW-PROXY www1.zdv.uni-tuebingen.de: + www2.zdv.uni-tuebingen.de + + COMREFUSE -- If configured, implements an interrupt-driven + time-slicing of the gateway. During these + slices only a maximum number of accesses + from a given group of IP-addresses is permitted; + additional accesses will lead to immediate + suspension of the IP connection to the WWW + client; this suspension will last for a con- + figured number of time-slices, and service + for the IP domain in question will resume + afterwards. Additionally, access statistics will + be dumped to a file at given intervals; + the duration of a time-slice will be computed + randomly between a minimum and maximum; + all times are given in seconds + ( usually located in tweb.rc ) + + example: COMREFUSE 100 200 40 12 43200 + ./stats/hack-stats + + i.e.: minimum timeslice -> 100 secs + maximum timeslice -> 200 secs + number of accesses to tolerate in slice -> 40 + how long will be blocked -> 12 slices + period to write a stat-file -> 43200 secs + name of stat-file -> ./stats/hack-stats + (i.e., file relative to TWEB binary) + + STRICT-BASEDN -- Access to entries not below basedn is relayed + to another gateway ( -> GW-SWITCH must be set) + ( usually located in tweb.rc ) + + example: STRICT-BASEDN + + MAXCOUNT -- The maximum number of displayed entries + ( usually located in tweb.rc ) + + example: MAXCOUNT 200 + + MAX-PERSON -- Maximum number of persons displayed in any of + the configured sub-lists ( -> SORT option), + if access is not allowed; + if STRICT is given, this number of persons is + shown at maximum, even in case of an + allowed access; + if NO-BROWSE is given, only non-person entries + will be displayed while browsing, whereas persons + have to be searched for + ( usually located in tweb.rc ) + + example: MAX-PERSON 5 STRICT NO-BROWSE + + NO-SHOW-RDN -- Matching rules for RDNs that will NOT be displayed + (e.g., technical entries in the DIT or internal + OUs not to be displayed by the GW) + words surrounded by spaces will be matched as + substrings; allignment to the start or end of + the tested RDN can be enforced by surrounding + the words with "|", on either side + ( usually located in tweb.rc ) + + example: NO-SHOW-RDN "|cn=Dummy notToBeShownRDN" + + SEARCH-ONLY -- Defines the root of a DIT area, where browsing + is restricted to non-person entries; person + entries can only be found by explicite searching + (with appropriate header and footer information) + ( usually located in tweb.conf ) + + example: SEARCH-ONLY "ou=students, o=my-university, + c=my" search-only.head.0 + search-only.foot.0 + + LEGAL -- Flag for displaying of a comment concerning + Peoples Rights + (the text is configured in the tweb.lang.x files, + string numbered 65 of the gateway) + (Comment: certainly, it would be better to have + that text in an external file) + Sub-option ON-TOP directs TWEB to display the + message immediately below the HEADER information, + not above the FOOTER message + ( usually located in tweb.rc ) + + example: LEGAL ON-TOP + + CACHE-EXPIRE-DEFAULT -- The default value for the expire time + in seconds. After this time the page is no + longer cached by a browser or WWW cache. + ( usually located in tweb.rc ) + + example: CACHE-EXPIRE-DEFAULT 900 + + CACHING-TERMS -- A more detailed description of caching directives. + Format: + <expire-time> READ|MENU|L2ND RDN|OC <value> + ... + + To specify for a given access-type: + READ|MENU|L2ND (L2ND = second page) the expire-time + in seconds for given RDN|OC values + ( usually located in tweb.rc ) + + BEWARE: THIS OPTION IS NOT USED AT THE AUTHOR'S + SITE, ROUTINELY. THUS, CORRECT BEHAVIOUR + CANNOT BE GARANTEED ! + + example: CACHING-TERMS 3600 READ RDN Fax + 7200 MENU OC person + 10800 menu RDN Mueller + + MODIFY/MODATTR -- Selects for specified object-class (MODIFY) the + attributes permitted for modification, their + labels and the maximum number of values to be + handled by TWEB (MODATTR) + ( usually located in tweb.conf ) + + BEWARE: THIS OPTION IS NOT USED AT THE AUTHOR'S + SITE, ROUTINELY. THUS, CORRECT BEHAVIOUR + CANNOT BE GARANTEED ! + + example: MODIFY person + MODATTR personalTitle title 1 + telephoneNumber phone 2 + ... + + NO-MODIFY -- Entries that contain one of the named + ObjectClasses will be displayed without + the possibility for modification. + ( usually located in tweb.rc ) + + example: NO-MODIFY |toc_primas| + + +3.3 Load balancing configuration options + + This section lists configuration options related to gateway-switching. + + GW-SWITCH -- Defines DIT areas, which will direct TWEB to + introduce other gateway addresses for the + so-called gateway-switching + (STATIC gateway-switching; see section 2.7) + ( usually located in tweb.conf ) + + REMARK: A set of slides explaining gateway-switching, + presented at the January-1999 DANTE meeting + in Utrecht, NL, can be found at the TWEB FTP + site at + ftp://ftp-x500.uni-tuebingen.de/tweb + + example: GW-SWITCH "ROOT" HTTP://x500-relay. + uni-tuebingen.de:8901/M + "c=DE" HTTP://x500-relay. + uni-tuebingen.de:8911/ + + DYNAMIC-GW -- If given, tells TWEB to use dynamic gateway- + switching; if not given, only static switching + will be used, if configured; + a labeledURI attribute in an X.500 entry con- + taining (gw), (gw-de), or (gw-en) in its label + part is used to link this entry to another gateway + ( usually located in tweb.rc ) + + example: DYNAMIC-GW + +3.4 Display configuration options + + This section lists options related to the displaying of results on an + HTML page. The options direct display of entries, attributes, as well + as styles for displaying. + + SORT -- Classification of a list of entries into sub-lists + according to their object classes; generating of + sub-lists will be according to the order the + OCs are given in the SORT option; displaying the + sub-lists will be according to the numbers given + as third parameter; sub-lists without an intro- + ducing label (second parameter) should have a + label of " "; the fourth parameter is the DISPLAY- + TYPE for a given object (see below) and the fifth + parameter is the attribute used for sorting; + parameters four and five are optional; + if not given reasonable defaults will be used; + if none of the entries objectclasses is given + in the SORT option, TWEB will randomly select + one of the entry's OCs as a new entry to the + SORT list, using DISPLAY-TYPE "default"; if that + type is not defined, the entry will NOT be + displayed at all + (see also section 2.5) + ( usually located in tweb.conf.x ) + + example: SORT person Staff 4 person tat_sort + organization Organizations 3 orgs + organizationalUnit "O Units" 2 ous + ... + + DISPLAY-OBJECT -- For specified DISPLAY-TYPES define the order, + labels and type of HTML-code produced for given + attributes (see FIRST-PAGE, SECOND-PAGE below); + a DISPLAY-TYPE "default" will match all types + NOT specifically listed; when the default type + is not giving, some X.500 entries might NOT be + displayed (see also SHOW-DEFOC below) + ( usually located in tweb.conf.x ) + + example: DISPLAY-OBJECT person + FIRST-PAGE .... + + FIRST-PAGE -- Attributes to be displayed for a specified + DISPLAY-TYPE + Format: <attribute> <label> <display-type> + Display-types: + MULTILINE -- attribute with multiple lines + DATE -- attribute as date + HREF -- attribute with syntax DN + as hyperlink (READ DN entry) + URI -- attribute with syntax URL + as hyperlink + MAILTO -- attribute as mailto (must be + supported by WWW client) + MOVETO -- like HREF, but the link will + be a LIST, instead of a READ + hyperlink + BMP -- phote as bitmap + JPEG -- photo as jpeg + JPEG2GIF -- convert jpeg to gif + BOOLEAN -- binary attribute + PGPKEY -- display PGPKey for cut&paste + DYNAMICDN -- uses DIT-CONFIG to show + attribute as hyperlink + INDEXURL -- show this hyperlink as defined + with INDEX-URL + DEFAULT -- anything else + + example: DISPLAY-OBJECT person + FIRST-PAGE cn Name DEFAULT + personalTitle Title DEFAULT + ... + + SECOND-PAGE -- show additional attributes not displayed on + the first page + + example: DISPLAY-OBJECT person + FIRST-PAGE ... + ... + SECOND-PAGE sn Surname DEFAULT + info Information DEFAULT + + SHOW-DEFOC -- Show Default Objectclass. If no objectclass + did match -> show entry with attributes as + defined in default-display + ( usually located in tweb.rc ) + + example: SHOW-DEFOC + + PULL-DOWN-MENUS -- Use BUTTONS and PULL-DOWN-MENUS instead of links + in order to support: help, language-switch, + move-upwards and read-entry functionalities + ( usually located in tweb.rc ) + + example: PULL-DOWN-MENUS + + LANGUAGE -- The labels of buttons for the switch to + the other started language-specific gateways + ( usually located in tweb.rc ) + + example: LANGUAGE Deutsch + English + Français + + STRIP-PIN -- Specify here the object-classes where numbers + ( PINs, personal ident numbers, etc. ) following + an RDN will be stripped when displayed + ( usually located in tweb.rc ) + + example: STRIP-PIN |toc_profs|person|toc_primas| + toc_cperson|toc_funcs|toc_pextra| + + INDIRECT-ATTRS -- Format: + INDIRECT-ATTRS <ref-attribute> + IND_ATTRS <selection> REPLACE|APPEND <attribute> + <host> <port> <baseDN> + + If there is an attribute with name <ref-attribute> + in a given entry, values of attribute <attribute> + in this entry will be REPLACEed|APPENDed by values + taken from the same attribute <attribute> of + an entry with DN: + "cn=<ref-attribute-value>,<baseDN>", + looked-up at an LDAP server <host>:<port>, + but only when some value in <ref-attribute> + matches <selection> at its beginning + ( usually located in tweb.rc ) + + example: INDIRECT-ATTRS tat_refattr + IND_ATTRS POST- append postaladdress + x500.uni-tuebingen.de 10100 + "ou=POST,ou=INTERNA,ou=NETZWERK, + o=Universitaet Tuebingen,c=DE" + + DISP-SEA-RDN -- Make search-results to be displayed only by RDN + and not by DN relative to the search-base + ( usually located in tweb.rc ) + + example: DISP-SEA-RDN + + INDEX-URL -- Display labels of hyperlinks only with selected + RDN parts in the order configured by INDEX-URL; + this option applies to URL attributes within an + entry, which are directed towards other X.500 + entries; an application of that might be an + index of entries + DISPLAY-TYPE must be set to INDEXURL. + ( usually located in tweb.rc ) + + example: INDEX-URL 0,-2 "o=Universitaet Tuebingen, c=DE" + + i.e.: labels of a hyperlink below the University + of Tuebingen are shown as follows: + + 1. lowest part of the DN (e.g., a person's name) + 2. third-top-most part of the DN (e.g., faculty) + + all other DN parts will be supressed + + TABLES -- Format: + TABLES <ALLOW|ALL> <objectclass> <Button-label> + <mode-selection>:<attribute>,<col-width> + [&<attribute>,<col-width>]* + + During browsing, the entries listed below a + base object (i.e., DIT position) can be displayed + together with some selected attributes in a + tabular format; the SORT configuration option + will be applied to the entries; attribute mail + will be displayed as mailto: and the RDN will + be displayed as a link to the respective entry; + in order to select the tabular format, TWEB will + display a button with a given label, that, if + pressed, will request the tabular format; + however, the button will only be displayed, if + the requesting user is allowed to get this + feature (i.e., ALLOW will select internal users + only, whereas ALL will select all users) + + example: TABLES ALLOW oleaf Tabelle persontable:rdn,28 + &telephonenumber,25&tat_dummyattr,2 + &mail,45 + + i.e.: ALLOW -> only allowed users will see the table + oleaf -> table button is shown on presence of + the objectclass oleaf in the base entry + Tabelle -> the label for the table-request- + button + persontable -> the keyword for function- + selection of a persons' table + rdn,28 -> first the rdn-attribute is shown + in the table with width 28 percent + telephonenumber,25 -> telephonenumber, + width 25 + tat_dummyattr,2 -> a separating column, width 2 + mail,45 -> the e-mail-address with width 45 + + (all width values are given in percentage of + the width of the browsers window, and should + sum up to 100 %) + + +4 Support and discussion list + + Bug reports and flames (but also critical comments) send to + + tweb-support@mail500.uni-tuebingen.de. + + For general discussion (e.g., about interesting new features, + which should be supported), there is a discussion list at + + tweb-l@mail500.uni-tuebingen.de. + + Send requests for subscription to + + tweb-l-request@mail500.uni-tuebingen.de. + + + +TWEB development team, Tuebingen, January, 15th, 1999 + + diff --git a/contrib/tweb/GETTING-STARTED.openldap b/contrib/tweb/GETTING-STARTED.openldap new file mode 100644 index 0000000000000000000000000000000000000000..d1d958c14d5aa73c617bbd591e945e305e09bb05 --- /dev/null +++ b/contrib/tweb/GETTING-STARTED.openldap @@ -0,0 +1,75 @@ +TWEB WWW-X500 GATEWAY - GETTING STARTED + +With the information provided by this file you should be able to start +an initial version of TWEB. Please follow the steps below: + +1. Copy the distribution Makefile onto Makefile: + + > cp Makefile.openldap Makefile + +2. Edit the Makefile. You have to change the variables in the first block of + the file to your appropriate settings: + + > vi Makefile + +3. Now type in make: + + > make + + This should make a binary called tweb whithout severe problems + +4. Running the TWEB www-x500 gateway + +4.1. Testing the newly compiled binary + + Copy the tweb binary to the sub-directory TWEB_conFiles and + change to that directory: + + > cp tweb TWEB_conFiles + > cd TWEB_conFiles + + Copy the config files with extension .dist to their respective + basefiles: + + > cp tweb.rc.dist tweb.rc + > cp tweb.conf.0.dist tweb.conf.0 + > cp tweb.conf.1.dist tweb.conf.1 + > cp tweb.lang.0.dist tweb.lang.0 + > cp tweb.lang.1.dist tweb.lang.1 + + Edit tweb.rc to adjust the variables in the + first block to your appropriate settings: + + > vi tweb.rc + + Run TWEB with language 0 and 1 (i.e., german and english) + + > ./tweb -L01 + + This will run two TWEB server processes, one for german language, the + other for english language, whithout syslog logging; + you can assess them with your WWW browser by giving the URL + + http://<your-tweb-host>:<your-tweb-port>/ + +4.2. Adapting TWEB to your local requirements + + When you reached this point you have a running TWEB with basic + functionality. Have a look to the FEATURE-LIST file for a + description of all features, TWEB does provide. The least, you + might want to change are the several header and footer files + in order to build up your organizational identity with TWEB. + But check also the security features, and the performance (i.e., + load balancing) features. By setting the respective parameters, + TWEB can provide for a very special appearance with local require- + ments enforced as far as possible. Should you want more reasonable + features, please don't hesitate to contact the development team. + + + Have fun, + + TWEB development team, Tuebingen, September, 9th, 1999 + + email: tweb-support@mail500.uni-tuebingen.de + + diff --git a/contrib/tweb/LDAP_etc/allow.msg.0 b/contrib/tweb/LDAP_etc/allow.msg.0 new file mode 100644 index 0000000000000000000000000000000000000000..3314bfccc725106e3fc48a0507bb93015288fc6e --- /dev/null +++ b/contrib/tweb/LDAP_etc/allow.msg.0 @@ -0,0 +1,4 @@ +<strong>Datei: LDAP_etc/allow.msg.0<br> +Achtung</strong>: Dies ist eine Meldung, die nur dem authorisierten +Nutzer angezeigt wird !!! +<hr> diff --git a/contrib/tweb/LDAP_etc/allow.msg.1 b/contrib/tweb/LDAP_etc/allow.msg.1 new file mode 100644 index 0000000000000000000000000000000000000000..9a5c3116d793584bf9312671596f95efe4664a95 --- /dev/null +++ b/contrib/tweb/LDAP_etc/allow.msg.1 @@ -0,0 +1,4 @@ +<strong>File: LDAP_etc/allow.msg.1<br> +Attention</strong>: This message will only be shown to the +permitted user. +<hr> diff --git a/contrib/tweb/LDAP_etc/ldapfilter.conf b/contrib/tweb/LDAP_etc/ldapfilter.conf new file mode 100644 index 0000000000000000000000000000000000000000..d18938469c83b44b2a16d8afbfb6e24a20cf1c68 --- /dev/null +++ b/contrib/tweb/LDAP_etc/ldapfilter.conf @@ -0,0 +1,86 @@ +# ldap filter file +# +# lines like this that start with # or empty lines are ignored +# +# syntax: +# +# <tag> +# <pattern1> <delimiters> <filter1-1> <desc1-1> [<scope>] +# <filter1-2> <desc1-2> [<scope>] +# +# <pattern2> <delimiters> <filter2-1> <desc2-1> [<scope>] ... +# +# The "desc" should describe the filter and it should correctly complete +# both of the following phrases: +# +# One <desc> match was found for... +# Three <desc> matches were found for... +# +# The scope is optional, and should be one of: +# "base" +# "onelevel" +# "subtree" +# if it is included. +# + +"finger and go500 and go500gw subtree and rp500 and rcpt500" + "=" " " "%v" "arbitrary filter" + + "^[0-9][0-9\-]*$" " " "(telephoneNumber=*%v)" "phone number" + + "@" " " "(mail=%v)" "email address" + "(mail=%v*)" "start of email address" + + "^.[\. _].*" ". _" "(cn=%v1* %v2-)" "first initial" + + ".*[. _].$" ". _" "(cn=%v1-*)" "last initial" + + "[. _]" ". _" "(|(sn=%v1-)(cn=%v1-))" "exact" + "(|(sn~=%v1-)(cn~=%v1-))" "approximate" + + ".*" ". " "(|(cn=%v1)(sn=%v1)(uid=%v1))" "exact" + "(|(cn~=%v1)(sn~=%v1))" "approximate" + +"web500gw subtree" + "=" " " "%v" "arbitrary filter" + + "^[0-9][0-9\-]*$" " " "(|(telephoneNumber=*%v)(facsimileTelephoneNumber=*%v))" "phone number" + + "@" " " "(mail=%v)" "email address" + "(mail=%v*)" "start of email address" + + "^.[\. _].*" ". _" "(cn=%v1* %v2-)" "first initial" + + ".*[. _].$" ". _" "(cn=%v1-*)" "last initial" +############ +# "[. _]" ". _" "(|(sn=%v1-)(cn=%v1-))" "exact" +# "(|(sn~=%v1-)(cn~=%v1-))" "approximate"## +# +# ".*" ". " "(|(cn=%v1)(sn=%v1))" "exact" +# "(|(cn~=%v1)(sn~=%v1))" "approximate"# +# +# Neue Einstellungen 970127 KPG: + "[oO][xX]:.*" ":" "(|(ou=%v2-))" "exact" + "[xX][oO]:.*" ":" "(|(ou=%v2-))" "exact" + "[oO]:.*" ":" "(|(ou=%v2-))" "exact" + "(|(ou~=%v2-))" "approximate" + "[xX]:.*[. _].*" ":" "(|(cn=%v2%v3%v4-))" "exact" + "[xX]:.*" ":" "(|(sn=%v2-))" "exact" + + "[. _]" ". _" "(|(cn=%v))" "exact" + "(|(cn~=%v))" "approximate" + + ".*" ". " "(|(sn=%v))" "exact" + "(|(sn~=%v))" "approximate" + +"go500gw onelevel and web500gw onelevel" + "^..$" " " "(|(o=%v)(c=%v)(l=%v)(co=%v))" "exact" + "(|(o~=%v)(c~=%v)(l~=%v)(co~=%v))" "approximate" + + " " " " "(|(o=%v)(l=%v)(co=%v))" "exact" + "(|(o~=%v)(l~=%v)(co~=%v))" "approximate" + + "\." " " "(associatedDomain=%v)" "exact" + + ".*" " " "(|(o=%v)(l=%v)(co=%v))" "exact" + "(|(o~=%v)(l~=%v)(co~=%v))" "approximate" diff --git a/contrib/tweb/LDAP_etc/ldapfriendly.0 b/contrib/tweb/LDAP_etc/ldapfriendly.0 new file mode 100644 index 0000000000000000000000000000000000000000..fba7fd7e205144b2a6f84af11ae33cfb029f23d3 --- /dev/null +++ b/contrib/tweb/LDAP_etc/ldapfriendly.0 @@ -0,0 +1,40 @@ +AU Australien +AR Argentinien +AT Österreich +BE Belgien +BR Brasilien +CA Kanada +HR Kroatien +CS Tschechoslowakei +CZ Tschechische Republik +DK Dänemark +FI Finnland +FR Frankreich +DE Deutschland +EE Estland +GB Großbritannien +GR Griechenland +HK Hong Kong +HU Ungarn +IS Island +IN Indien +IE Irland +IL Israel +IT Italien +JP Japan +KR Korea +LI Liechtenstein +LU Luxemburg +NL Niederlande +NZ Neuseeland +NO Norwegen +PL Polen +PT Portugal +ES Spanien +SE Schweden +CH Schweiz +RU Russische Föderation +US Vereinigte Staaten von Amerika +SI Slowenien +SK Slowakei +SG Singapur diff --git a/contrib/tweb/LDAP_etc/ldapfriendly.1 b/contrib/tweb/LDAP_etc/ldapfriendly.1 new file mode 100644 index 0000000000000000000000000000000000000000..e7aacbea9f6167ae51766aea8e550329100f9252 --- /dev/null +++ b/contrib/tweb/LDAP_etc/ldapfriendly.1 @@ -0,0 +1,40 @@ +AU Australia +AR Argentina +AT Austria +BE Belgium +BR Brazil +CA Canada +HR Croatia +CS Czechoslovakia +CZ Czech Republic +DK Denmark +FI Finland +FR France +DE Germany +EE Estonia +GB Great Britain +GR Greece +HK Hong Kong +HU Hungary +IS Iceland +IN India +IE Ireland +IL Israel +IT Italy +JP Japan +KR Korea +LI Liechtenstein +LU Luxemburg +NL Netherlands +NZ New Zealand +NO Norway +PL Poland +PT Portugal +ES Spain +SE Sweden +CH Switzerland +RU Russian Federation +US United States of America +SI Slovenia +SK Slovakia +SG Singapore diff --git a/contrib/tweb/LDAP_etc/search-only.foot.0 b/contrib/tweb/LDAP_etc/search-only.foot.0 new file mode 100644 index 0000000000000000000000000000000000000000..2450db2aec81715fd4a77c67d96fcdcff4a257dc --- /dev/null +++ b/contrib/tweb/LDAP_etc/search-only.foot.0 @@ -0,0 +1,4 @@ +<hr> +<strong>Datei: LDAP_etc/search-only.foot.0<br> +Achtung:</strong> Dieser Text wird als Footer einer Search-Only-Seite +angezeigt !!! diff --git a/contrib/tweb/LDAP_etc/search-only.foot.1 b/contrib/tweb/LDAP_etc/search-only.foot.1 new file mode 100644 index 0000000000000000000000000000000000000000..9db7150fc25eb60f6e0a1bf072c9ff78d2bd08ec --- /dev/null +++ b/contrib/tweb/LDAP_etc/search-only.foot.1 @@ -0,0 +1,4 @@ +<hr> +<strong>File: LDAP_etc/search-only.foot.1<br> +Attention:</strong> This footer will be display'ed at the end +of a search-only page. diff --git a/contrib/tweb/LDAP_etc/search-only.head.0 b/contrib/tweb/LDAP_etc/search-only.head.0 new file mode 100644 index 0000000000000000000000000000000000000000..dc1fe4c7b2cd22c4eec62ffbaa832247f1003559 --- /dev/null +++ b/contrib/tweb/LDAP_etc/search-only.head.0 @@ -0,0 +1,5 @@ +<h1>Search-Only-Seite</h1> +<strong>Datei: LDAP_etc/search-only.head.0<br> +Achtung:</strong> Dieser Text wird am Beginn einer Search-Only-Seite +angezeigt !!! +<hr> diff --git a/contrib/tweb/LDAP_etc/search-only.head.1 b/contrib/tweb/LDAP_etc/search-only.head.1 new file mode 100644 index 0000000000000000000000000000000000000000..ff4f62c9084203d998ac657523bc8072ae9089a1 --- /dev/null +++ b/contrib/tweb/LDAP_etc/search-only.head.1 @@ -0,0 +1,5 @@ +<h1>Search-Only-Page</h1> +<strong>File: LDAP_etc/search-only.head.1<br> +Attention:</strong> This header will be display'ed at the beginning +of a search-only page. +<hr> diff --git a/contrib/tweb/LDAP_etc/tweb-base.foot.0 b/contrib/tweb/LDAP_etc/tweb-base.foot.0 new file mode 100644 index 0000000000000000000000000000000000000000..2daad03d27a366df7e23a885ebf34ca7abef8cb1 --- /dev/null +++ b/contrib/tweb/LDAP_etc/tweb-base.foot.0 @@ -0,0 +1,4 @@ +<hr> +<strong>Datei: LDAP_etc/tweb-base.foot.0<br> +Achtung:</strong> Diese Seite wird als Footer auf der BASEDN-Seite +angezeigt !!! diff --git a/contrib/tweb/LDAP_etc/tweb-base.foot.1 b/contrib/tweb/LDAP_etc/tweb-base.foot.1 new file mode 100644 index 0000000000000000000000000000000000000000..0a8975e81a839792ab17304068c41a90850ee467 --- /dev/null +++ b/contrib/tweb/LDAP_etc/tweb-base.foot.1 @@ -0,0 +1,4 @@ +<hr> +<strong>File: LDAP_etc/tweb-base.foot.1<br> +Attention:</strong> This text will be display'ed at the end of +the BASEDN page. diff --git a/contrib/tweb/LDAP_etc/tweb-base.head.0 b/contrib/tweb/LDAP_etc/tweb-base.head.0 new file mode 100644 index 0000000000000000000000000000000000000000..d1626ca2e8c1343baae52994683b21947360624c --- /dev/null +++ b/contrib/tweb/LDAP_etc/tweb-base.head.0 @@ -0,0 +1,5 @@ +<h1>BASEDN-Header</h1> +<strong>Datei: LDAP_etc/tweb-base.head.0<br> +Achtung:</strong> Dieser Header wird am Beginn der BASEDN-Seite +angezeigt !!! +<hr> diff --git a/contrib/tweb/LDAP_etc/tweb-base.head.1 b/contrib/tweb/LDAP_etc/tweb-base.head.1 new file mode 100644 index 0000000000000000000000000000000000000000..0c4dd9da9b4471ef82be2c7b516a59e224001bdb --- /dev/null +++ b/contrib/tweb/LDAP_etc/tweb-base.head.1 @@ -0,0 +1,5 @@ +<h1>BASEDN-Header</h1> +<strong>File: LDAP_etc/tweb-base.head.1<br> +Attention:</strong> This header will be display'ed at the beginning +of the BASEDN page. +<hr> diff --git a/contrib/tweb/LDAP_etc/tweb.footer.0 b/contrib/tweb/LDAP_etc/tweb.footer.0 new file mode 100644 index 0000000000000000000000000000000000000000..414cf57babc5c07710aeb4bf0a2a22014010ed55 --- /dev/null +++ b/contrib/tweb/LDAP_etc/tweb.footer.0 @@ -0,0 +1,4 @@ +<hr> +<strong>Datei: LDAP_etc/tweb.footer.0<br> +Achtung:</strong> Dieser Footer wird am Ende einer normalen +Seite unterhalb BASEDN angezeigt !!! diff --git a/contrib/tweb/LDAP_etc/tweb.footer.1 b/contrib/tweb/LDAP_etc/tweb.footer.1 new file mode 100644 index 0000000000000000000000000000000000000000..88bcc1c41ec8615dfbdb61ca04990a7038d938a4 --- /dev/null +++ b/contrib/tweb/LDAP_etc/tweb.footer.1 @@ -0,0 +1,4 @@ +<hr> +<strong>File: LDAP_etc/tweb.footer.1<br> +Attention:</strong> This footer will be display'ed at the end of a page +below BASEDN. diff --git a/contrib/tweb/LDAP_etc/tweb.header.0 b/contrib/tweb/LDAP_etc/tweb.header.0 new file mode 100644 index 0000000000000000000000000000000000000000..b83c44e6676228c5ce256c5f41b76c9abf25ebe9 --- /dev/null +++ b/contrib/tweb/LDAP_etc/tweb.header.0 @@ -0,0 +1,5 @@ +<h1>TWEB</h1> +<strong>Datei: LDAP_etc/tweb.header.0<br> +Achtung:</strong> Dieser Header wird am Beginn einer Seite unterhalb +von BASEDN angezeigt !!! +<hr> diff --git a/contrib/tweb/LDAP_etc/tweb.header.1 b/contrib/tweb/LDAP_etc/tweb.header.1 new file mode 100644 index 0000000000000000000000000000000000000000..a4dfb09f9eaf7cf63eb23d246a5ad2a18c989b6a --- /dev/null +++ b/contrib/tweb/LDAP_etc/tweb.header.1 @@ -0,0 +1,5 @@ +<h1>TWEB</h1> +<strong>File: LDAP_etc/tweb.header.1<br> +Attention:</strong> This header will be display'ed at the beginning of +a page below BASEDN. +<hr> diff --git a/contrib/tweb/LDAP_etc/tweb.help.0 b/contrib/tweb/LDAP_etc/tweb.help.0 new file mode 100644 index 0000000000000000000000000000000000000000..fd8913b065b51b8f22c990afd37a1f6a12e24f66 --- /dev/null +++ b/contrib/tweb/LDAP_etc/tweb.help.0 @@ -0,0 +1,46 @@ +<TITLE>TWEB HILFE</TITLE> +<BODY> +<H2> Das TWEB WWW2X.500-Gateway </H2> + +Im X.500 sind weltweit viele Personen und Organisationen mit EMail- Adresse, +Postanschrift, FAX, Telefonnummer, Aufgabenbereich, etc. zu finden. +Zum einfachen Zugriff per WorldWideWeb dient <strong>TWEB</strong> WWW2X.500-Gateway.<P> + +<strong>TWEB</strong> ermöglicht das einfache Browsen, die Suche +und die Modifikation des eigenen Eintrages im X.500.<P> +Das Gateway enthält folgende Features +<ul> + +<li>Für den Administrator bietet <strong>TWEB</strong> umfangreiche Möglichkeiten +der Konfiguration mittels Konfigurations-Dateien, ohne Änderungen im +Code und ohne erneutes Übersetzen. +<li>Zusätzlich sind Datenschutzmechanismen aktivierbar. +<li>Andere Sprachen sind durch Ersetzen/Hinzufügen +von Sprach-Dateien leicht realisierbar. + +<li>Wie Sie es vom WWW her gewohnt sind, brauchen Sie nur den gewünschten +unterstrichenen Eintrag anklicken, und Sie sehen, was darunter angesiedelt ist. + +<li>Mit "Weitere Informationen" wird eine zweite Info-Seite gezeigt. + +<li>Mit Hilfe der SUCH-Box können Sie nach Namen und Teilstrings suchen. + +<li>Ihren eigenen Eintrag können Sie mit Ihrem Passwort in Verbindung +mit dem entsprechenden Button ändern. +</ul> + + +<hr> + +<strong>TWEB</strong> ist eine Weiterentwicklung vom Web500gw von Frank Richter, Technische +Universitaet Chemnitz-Zwickau, basierend auf go500gw von Tim Howes, +University of Michigan. + +<hr> + +Bei Fragen, Anregungen, Bug-Reports Mail an: + +<ADDRESS><A HREF="mailto:web500gw-support@mail500.uni-tuebingen.de"> web500gw-support@mail500.uni-tuebingen.de</A> - Stand: 16. Februar 1996</ADDRESS> + +<hr> + diff --git a/contrib/tweb/LDAP_etc/tweb.help.1 b/contrib/tweb/LDAP_etc/tweb.help.1 new file mode 100644 index 0000000000000000000000000000000000000000..54f615b1c9f9a0987b2bfe0c532ecebe6de4938c --- /dev/null +++ b/contrib/tweb/LDAP_etc/tweb.help.1 @@ -0,0 +1,47 @@ +<TITLE>TWEB HELP</TITLE> +<BODY> +<H2> TWEB WWW2X.500-Gateway HELP</H2> + +There are worldwide lots of persons and organizations stored in the X.500- +directory with email-address, postal address, fax, telephone-number, +working-area, etc. For easy access with WorldWideWeb there is the +<strong>TWEB</strong> WWW2X.500-Gateway.<P> + +<strong>TWEB</strong> allows easy browsing, searching and modification of +entries in the X.500-directory.<p> +Features of the gateway include +<ul> +<li>For the administrator <strong>TWEB</strong> offers extensive opportunities of +configuration by means of configuration-files without change of code +and without recompilation. +<li>Configurable data-protection-mechanisms are available. +<li>Other languages are supported by language-resource-files. + +<li>As with other WWW applications you only have to click on the desired entry +to see, what is settled beneath. + +<li>The button "More Information" shows a second page of information. + +<li>By means of the SEARCH-box you can look for persons with exact or substring +match. + +<li>You can modify your own entry by typing in your password in combination +with the modification button. +</ul> + + + +<hr> + +<strong>TWEB</strong> is based on Web500gw from Frank Richter, Technische +Universitaet Chemnitz-Zwickau, that itself is based on go500gw from Tim Howes, +University of Michigan. + +<hr> + +For questions, suggestions, bug-reports mail to: + +<ADDRESS><A HREF="mailto:x500-netman@mail500.uni-tuebingen.de"> x500-netman@mail500.uni-tuebingen.de</A> - 27. October 1995</ADDRESS> + +<hr> + diff --git a/contrib/tweb/Makefile.openldap b/contrib/tweb/Makefile.openldap new file mode 100644 index 0000000000000000000000000000000000000000..218a65d074dd70637e9273fa20f486a7b91d0aa1 --- /dev/null +++ b/contrib/tweb/Makefile.openldap @@ -0,0 +1,105 @@ +#*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +# * +# Makefile... * +# * +# Function:..TWEB WWW to X.500-GATEWAY SERVER MAKEFILE * +# * +# * +# * +# Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +# Zentrum fuer Datenverarbeitung, * +# Bereich Entwicklungneuer Dienste, * +# Universitaet Tuebingen, GERMANY * +# * +# ZZZZZ DDD V V * +# Creation date: Z D D V V * +# August 16 1995 Z D D V V * +# Last modification: Z D D V V * +# September 9 1999 ZZZZ DDD V * +# * +#/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/*/ +#----------------------------------------------------------------------------- +# +# based on web500gw.c of Frank Richter, TU Chemnitz-Zwickau, DE +# +# first edition: 95/07/28, /KSp +# +# $Id: Makefile.openldap,v 1.6 1999/09/10 15:01:15 zrnsk01 Exp $ +# +#----------------------------------------------------------------------------- + +######################################################################### +### +### Tailor the following to your local settings +### +######################################################################### + +# where is your LDAP client library located +LDAP_RUNTIME=/LDAP +LDAP_SOURCE =/LDAP/ldap-3.3 + +LIBDIR= $(LDAP_RUNTIME)/lib +INCDIR= $(LDAP_RUNTIME)/include + +# where is some version information for your LDAP client library +LDAPDIR= $(LDAP_SOURCE)/build + +# select your compiler (DEFAULT=cc) and uncomment ACFLAGS and/or COPTS +# to have options for the linker and/or compiler +CC= gcc +# ACFLAGS= +# COPTS= -Aa -O # cc on a HP box +COPTS= -Wall -ansi -pedantic -O2 + +# uncomment next line when compiling on SUN +# LXNET = -lxnet + +# we don't have any special definitions for the current distribution +# DEFINES= + +######################################################################### +### +### You should leave the following definitions untouched +### +######################################################################### + +SRCS = tweb.c strng.c init.c queries.c server.c \ + x500.c html.c support.c checkclient.c \ + charray.c ch_malloc.c dn.c regular.c +OBJS = tweb.o strng.o init.o queries.o server.o \ + x500.o html.o support.o checkclient.o \ + charray.o ch_malloc.o dn.o regular.o +GWOBJS = $(OBJS) gwversion.o + +CFLAGS = $(COPTS) -I$(INCDIR) $(ACFLAGS) $(DEFINES) $(GWVERS) +LIBS = -lldap -llber $(KRBLIBFLAG) $(KRBLIBS) $(LXNET) +DLIBS = $(LIBDIR)/libldap.a $(LIBDIR)/liblber.a + +gw: gwversion.o + $(CC) $(ALDFLAGS) -o $@ $(GWOBJS) -L$(LIBDIR) $(LIBS) + mv $@ tweb + +gwversion.c: $(OBJS) $(DLIBS) + rm -f $@ + (u=$${USER-root} v=`cat $(LDAPDIR)/version` d=`pwd` h=`hostname` t=`date`; \ + sed -e "s|%WHEN%|$${t}|" \ + -e "s|%WHOANDWHERE%|$${u}@$${h}:$${d}|" \ + -e "s|%VERSION%|$${v}|" \ + < Versiongw.c > $@) + +lint:; + lint -I. $(SRCS) + +5lint:; + /usr/5bin/lint -I. $(SRCS) + +clean:; + rm -f *.o core a.out gwversion.c tweb + +depend:; + $(LDAPDIR)/mkdep $(CFLAGS) $(SRCS) + +# DO NOT DELETE THIS LINE -- mkdep uses it. +# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. + +# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/contrib/tweb/README b/contrib/tweb/README new file mode 100644 index 0000000000000000000000000000000000000000..91b088d5fe6e3c7238defea58b717516a2af0aec --- /dev/null +++ b/contrib/tweb/README @@ -0,0 +1,91 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* README * +* * +* Function:..Introduction to the WWW-X.500 gateway TWEB * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* September 14 1995 Z D D V V * +* Last modification: Z D D V V * +* January 19 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/*/ + + +IMPORTANT HINT FOR UPGRADING TO VERSION 2.3.x: + + the config-syntax of ALLOW-STRING DENY-STRING GRANT REFUSE has changed: + now regular expressions are used enabling shorter config strings. + + the language-files have been extended. Please use the newly provided + language-files or update your old ones. + + + +INTRODUCTION + + TWEB is based on the Web500gw implementation by Frank Richter, + Technische Universitaet Chemnitz-Zwickau, which is based on the + go500gw implementation by Tim Howes, University of Michigan. + + TWEB was compiled and tested on LINUX with cc, HPUX 9.05 with the + HP-ANSI C compiler, as well as SunOS 4.1.2 with the SUN C compiler. + TWEB was also compiled with gcc on all platforms. + + The UMICH LDAP client library version 3.0 or 3.3 + ( URL:ftp://terminator.rs.itd.umich.edu/ldap/ldap-3.3.tar.Z ) + must be installed on the machine (library path and include file + path is configured in Makefile). With QUIPU ICR-2.x the ISODE- + provided LDAP libraries should be used. As such, TWEB only supports + LDAP version 2 with the University of Michigan type C API. TWEB is + also adapted for the OpenLDAP LDAP library, release version 1.1.2 + (http://www.openldap.org). + + An upgrade to LDAP version 3 and a C API standadized by the IETF + is planned for a not so far away future, most probably in step + with the OpenLDAP package. + + TWEB, as provided here is a fully functional core gateway, which + is extended at the author's site by some local features. These + extensions are included into the same code base, so that some + "#ifdef TUE_TEL" or "#ifdef AMBIX" pre-processor statements can + be found throughout the code. + + Have a look at the doc sub-directory to get some further documentation. + + +INSTALLATION + + The installation and configuration of TWEB is described in the + GETTING-STARTED file. After making and testing the basic TWEB + you should have a look to file FEATURE-LIST to learn about the + several configuration parameters TWEB provides for runtime + configuration of the program. + + +SUPPORT + + Bug reports and flames (but also critical comments) please send to + + tweb-support@mail500.uni-tuebingen.de. + + For general discussion (e.g., about interesting new features, + which should be supported), there is a discussion list at + + tweb-l@mail500.uni-tuebingen.de. + + Send requests for subscription to + + tweb-l-request@mail500.uni-tuebingen.de. + + +TWEB development team, Tuebingen, September, 9th, 1999 + + diff --git a/contrib/tweb/TWEB_conFiles/robots.txt b/contrib/tweb/TWEB_conFiles/robots.txt new file mode 100644 index 0000000000000000000000000000000000000000..1a3761aa8b358b072a1ca7023cf3ce0b5a74e5d7 --- /dev/null +++ b/contrib/tweb/TWEB_conFiles/robots.txt @@ -0,0 +1,3 @@ +# go away +User-agent: * +Disallow: / diff --git a/contrib/tweb/TWEB_conFiles/tweb.conf.0.dist b/contrib/tweb/TWEB_conFiles/tweb.conf.0.dist new file mode 100644 index 0000000000000000000000000000000000000000..eed392c9414b6bd17e6ce014d680a06ca3a9388b --- /dev/null +++ b/contrib/tweb/TWEB_conFiles/tweb.conf.0.dist @@ -0,0 +1,267 @@ +#*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +# * +# tweb.conf.0 * +# * +# Function:..Configuration-file for TWEB * +# * +# * +# * +# Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +# Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +# neuer Dienste, Universitaet Tuebingen, GERMANY * +# * +# ZZZZZ DDD V V * +# Creation date: Z D D V V * +# July 26 1996 Z D D V V * +# Last modification: Z D D V V * +# December 18 1998 ZZZZ DDD V * +# * +#/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/*/ +#========================================================================== +# $Id: tweb.conf.0.dist,v 1.6 1999/09/10 15:01:21 zrnsk01 Exp $ + + +# THE PARAMETERS IN THIS FILE AND THE CORRESPONDING CONFIG-FILE.1 +# ARE PRE-SET TO PROVIDE A BASIC FUNCTIONALITY. +# +# IF YOU LIKE, YOU CAN CHECK FOR FURTHER DISPLAY-OBJECTs, SORT, +# SEARCH-ONLY AND MODIFY DEFINITIONS IN THE SECOND PART OF THE FILE. +# +# TO ACTIVATE A CERTAIN FEATURE, THE CORRESPONDING LINES HAVE TO +# BE DE-COMMENTED + + +######################################################################### + + +### +### the description, how to display an object upon read +### + +# FIRST-PAGE is the main view, SECOND-PAGE a linked page with more +# (e.g., not so important) information +# +# given is a list of attributes, with labels for each and the method, +# how to display the content of the attribute + +DISPLAY-OBJECT pers +# 1.Bild +FIRST-PAGE cn Name DEFAULT + personalTitle Titel DEFAULT + organizationalStatus Dienststellung DEFAULT + description Arbeitsgebiet DEFAULT + telephoneNumber Geschäfts-Telefon DEFAULT + facsimileTelephoneNumber Fax DEFAULT + mail E-Mail-Adresse MAILTO + textEncodedORaddress X400-Adresse DEFAULT + postalAddress Anschrift MULTILINE + roomNumber Raum DEFAULT + labeledURI URL URI +# 2.Bild (see more) +SECOND-PAGE sn Nachname DEFAULT + roleOccupant Funktionsträger HREF + memberOfGroup E-Mail-Verteiler DEFAULT + homepostalAddress Heimat-Anschrift MULTILINE + homePhone Privat-Telefon DEFAULT + pager Pager DEFAULT + lastModifiedTime "letztmalig geändert" DATE + lastModifiedBy "letztmalig geändert von" DEFAULT + +DISPLAY-OBJECT organization +# 1.Bild +FIRST-PAGE o Name DEFAULT + ou Name DEFAULT + l Ort DEFAULT + description Beschreibung DEFAULT + postalAddress Postanschrift MULTILINE + telephoneNumber Telefon DEFAULT + facsimileTelephoneNumber Fax DEFAULT + labeledURI URL URI +# 2.Bild (see more) +SECOND-PAGE st Bundesland DEFAULT + seeAlso "weitere Informationen" MOVETO + lastModifiedTime "letztmalig geändert" DATE + lastModifiedBy "letztmalig geändert von" DEFAULT + +DISPLAY-OBJECT rfc822MailList +# 1. Bild +FIRST-PAGE description Beschreibung DEFAULT + joinable abonnierbar BOOLEAN + associatedDomain E-Mail-Domain DEFAULT + rfc822RequestsTo "Anfragen an" MAILTO + requestsTo "Anfragen an" HREF + owner Eigentümer HREF +# 2. Bild +SECOND-PAGE lastModifiedTime "letzte Änderung" DATE + lastModifiedBy "geändert durch" DEFAULT + +DISPLAY-OBJECT country +# 1.Bild +FIRST-PAGE friendlyCountryName Ländernamen DEFAULT + associatedDomain Domain DEFAULT + manager Manager HREF + labeledURI URL URI +# 2.Bild (see more) +SECOND-PAGE masterDSA Master-DSA HREF + slaveDSA Slave-DSA HREF + lastModifiedTime "letztmalig geändert" DATE + lastModifiedBy "letztmalig geändert von" DEFAULT + lastUpdateTime "letztmalig geändert" DATE + +DISPLAY-OBJECT default +# 1.Bild +FIRST-PAGE jpegPhoto Foto JPEG + photo Foto BMP + cn Name DEFAULT + sn Nachname DEFAULT + textEncodedMtaName MTA-Name DEFAULT + relatedMHSdomain MHS-Domain DEFAULT + description Beschreibung DEFAULT + multiLineDescription Beschreibung MULTILINE + info "Allgemeines" DEFAULT + productName Produktname DEFAULT + mail Mail-Adresse MAILTO + telephoneNumber Telefon DEFAULT + facsimileTelephoneNumber Fax DEFAULT + labeledURL URL URL + memberOfGroup E-Mail-Verteiler DEFAULT + member Mitglied HREF + owner Eigentümer HREF + requestsTo "Anfragen an" HREF + errorsTo "Fehler an" HREF + krbName Kerberos-Name DEFAULT + postalAddress Postanschrift MULTILINE + l Ort DEFAULT + textEncodedPSAP Netz-Adresse DEFAULT + presentationAddress Netz-Adresse DEFAULT + supportedApplicationContext Anwendung DEFAULT + publicAccess Zugang DEFAULT + availability Verfügbarkeit DEFAULT + knowledgeInformation Kontakt DEFAULT + seeAlso "siehe auch" HREF + roleOccupant Stelleninhabr HREF + manager Manager HREF + administrator Manager HREF + secretary Sekretariat HREF + associatedName "zugeordneter Name" HREF + responsiblePerson Verantwortlicher HREF + domainComponent Domain DEFAULT + labeledURI URL URI +# 2.Bild (see more) +SECOND-PAGE source Quelle DEFAULT + homePostalAddress Heimat-Anschrift MULTILINE + masterDSA Master-DSA HREF + slaveDSA Slave-DSA HREF + lastModifiedTime "letztmalig geändert" DATE + lastModifiedBy "letztmalig geändert von" DEFAULT + lastUpdateTime "letztmalig geändert" DATE + + +### +### sorting and display of groups of entries +### + +# while browsing and searching, entries below the current position +# in the DIT, or the search results, can be grouped according to some +# SORT rules; these rules determine, +# 1. which objectclass should signal a specific group, and in what +# order the entries should be checked for those objectclasses +# (the sequential order of the objectclasses given below), +# 2. what label should be applied to a group (" " means none), +# 3. the order of groups during output, +# 4. the display type for an object of the given object class +# when display´ing a read result, and +# 5. the attribute, that will control sort order of entries +# within each group +# the last two parameters are optional, and will default to display +# type ´default´ (see DISPLAY-OBJECTS), and sort attribute sn (surname) +# (if given in the entry, otherwise the RDN itself) +# +# When an entry has none of the listed object classes, it will NOT be +# included into the display !!! + +SORT dNSDomain Domäne 8 + domain Faxanschlüsse 9 + rfc822MailList X.500-E-Mail-Verteiler 10 rfc822MailList + organizationalPerson Mitarbeiter 1 pers registeredAddress + residentialPerson Privat-Personen 2 pers registeredAddress + person "sonstige Personen" 3 pers registeredAddress + locality Gebiete 7 organization + organization Organisationen 5 organization + organizationalUnit Unterorganisationen 6 organization + alias Verweise 11 + country Länder 4 country + + +### +### the position of certain language-specific support-files +### + +# a help file (accessible via http://host:port/H) +HELPFILE tweb.help.0 + +# converting certain RDNs to a more user-friendly form) +FRIENDLYFILE ldapfriendly.0 + +# header and footer beeing attached to every HTML page (not BASEDN) +HEADER tweb.header.0 +FOOTER tweb.footer.0 + +# a special message beeing attached to a HTML page when a allowed +# user accesses the gateway (see ALLOW-STRING/DENY-STRING in tweb.rc) +ALLOW-MSG allow.msg.0 + + +### +### some more settings for (language-specific) gateway-switches (see tweb.rc) +### + +# GW-SWITCH "ROOT" http://<my-world-relay.my-domain>:<port0>/M +# "c=<my-country-ID>" http://<my-country-relay.my-domain>:<port0>/ + + +### +### where to prevent listing and provide for searching only +### + +# a (list of) DN(s), where no person lists should be display´ed, but +# a search box only (e.g., because to many person are contained in +# here, so list results would be too long); also, which header and +# footer files will be display´ed at that position + +# SEARCH-ONLY "ou=<some-ou>, o=<my-organization>, c=<my-country-ID>" search-only.head.0 search-only.foot.0 + + +### +### modifying entries via TWEB +### + +# when the user is allowed to modify her own entry, MODIFY/MODATTR will +# describe, what can be modified +# +# BEWARE: this feature is not allowed at the University of Tuebingen, +# so the code is not tested very well; usage is on own risc + +# objects of what class can be modified +# (for each class a seperate description>) +# MODIFY person + +# what attributes can be modified +# a label in the HTTP formular is given for each attribute, +# together with the maximum count of values, beeing accepted +# in the input area + +# MODATTR personalTitle Titel 1 +# organizationalStatus Dienststellung 1 +# description Beschreibung 2 +# telephoneNumber Telefon 2 +# facsimileTelephoneNumber FAX 2 +# mail Mail-Adresse 2 +# roomNumber Raum 1 +# memberOfGroup Mailgruppe 10 +# homePostalAddress Heimatanschrift 1 +# homePhone "privat Telefon" 2 +# pager Pager 2 +# info Information 2 + + diff --git a/contrib/tweb/TWEB_conFiles/tweb.conf.1.dist b/contrib/tweb/TWEB_conFiles/tweb.conf.1.dist new file mode 100644 index 0000000000000000000000000000000000000000..29b5aec024d31983d260b1d1be9c6feb6ebc9a18 --- /dev/null +++ b/contrib/tweb/TWEB_conFiles/tweb.conf.1.dist @@ -0,0 +1,208 @@ +#*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +# * +# tweb.conf.1 * +# * +# Function:..Configuration-File for TWEB-SOFTWARE * +# * +# * +# * +# Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +# Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +# neuer Dienste, Universitaet Tuebingen, GERMANY * +# * +# ZZZZZ DDD V V * +# Creation date: Z D D V V * +# July 26 1995 Z D D V V * +# Last modification: Z D D V V * +# December 18 1998 ZZZZ DDD V * +# * +#/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/*/ +#========================================================================== +# $Id: tweb.conf.1.dist,v 1.6 1999/09/10 15:01:21 zrnsk01 Exp $ + +# FOR DESCRIPTION OF THE PARAMETERS SEE THE CONFIG FILE tweb.conf.0(.dist) + + +### +### the description, how to display an object upon read +### + +DISPLAY-OBJECT person +# main page +FIRST-PAGE cn Name DEFAULT + personalTitle Title DEFAULT + organizationalStatus Status DEFAULT + description Working-Area DEFAULT + telephoneNumber Telephone DEFAULT + facsimileTelephoneNumber Fax DEFAULT + mail E-Mail-Address MAILTO + textEncodedORaddress X400-Address DEFAULT + postalAddress "Postal address" MULTILINE + roomNumber Room DEFAULT + labeledURI URL URI +# additional page +SECOND-PAGE sn Surname DEFAULT + roleOccupant Role-Occupant HREF + memberOfGroup Group-Member DEFAULT + homepostalAddress Home-Address MULTILINE + homePhone Home-Phone DEFAULT + pager Pager DEFAULT + lastModifiedTime "Last modified Time" DATE + lastModifiedBy "Last modified by" DEFAULT + +DISPLAY-OBJECT organization +# main page +FIRST-PAGE o Name DEFAULT + ou Name DEFAULT + l Locality DEFAULT + description Description DEFAULT + postalAddress "Postal address" MULTILINE + telephoneNumber Telephone DEFAULT + facsimileTelephoneNumber Fax DEFAULT + labeledURI URL URI +# additional page +SECOND-PAGE st State DEFAULT + seeAlso "More Information" MOVETO + lastModifiedTime "Last modified Time" DATE + lastModifiedBy "Last modified by" DEFAULT + +DISPLAY-OBJECT rfc822MailList +# main page +FIRST-PAGE description Description DEFAULT + joinable Joinable BOOLEAN + associatedDomain E-Mail-Domain DEFAULT + rfc822RequestsTo "Requests to" MAILTO + requestsTo "Requests to" HREF + owner Owner HREF +# additional page +SECOND-PAGE lastModifiedTime "Last modified Time" DATE + lastModifiedBy "Last modified by" DEFAULT + +DISPLAY-OBJECT country +# main page +FIRST-PAGE friendlyCountryName Country-Name DEFAULT + associatedDomain Domain DEFAULT + manager Manager HREF + labeledURI URL URI +# additional page +SECOND-PAGE masterDSA Master-DSA HREF + slaveDSA Slave-DSA HREF + lastModifiedTime "Last modified Time" DATE + lastModifiedBy "Last modified by" DEFAULT + lastUpdateTime "Last update Time" DATE + +DISPLAY-OBJECT default +# main page +FIRST-PAGE jpegPhoto Photo JPEG + photo Photo BMP + cn Name DEFAULT + sn Surname DEFAULT + textEncodedMtaName MTA-Name DEFAULT + relatedMHSdomain MHS-Domain DEFAULT + description Description DEFAULT + multiLineDescription Description MULTILINE + info "More Information" DEFAULT + productName Productname DEFAULT + mail Mail-Address MAILTO + telephoneNumber Telephone DEFAULT + facsimileTelephoneNumber Fax DEFAULT + labeledURL URL URL + memberOfGroup "Member of Group" DEFAULT + member Member HREF + owner Owner HREF + requestsTo "Requests to" HREF + errorsTo "Errors to" HREF + krbName Kerberos-Name DEFAULT + postalAddress Postal-Address MULTILINE + l Locality DEFAULT + textEncodedPSAP "Network address" DEFAULT + presentationAddress "Network address" DEFAULT + supportedApplicationContext Application DEFAULT + publicAccess Access DEFAULT + availability Availability DEFAULT + knowledgeInformation Contact DEFAULT + seeAlso "See also" HREF + roleOccupant Role-Occupant HREF + manager Manager HREF + administrator Manager HREF + secretary Secretary HREF + associatedName "Associated Name" HREF + responsiblePerson "Responsible person" HREF + domainComponent Domain DEFAULT + labeledURI URL URI +# 2.Page (see more) +SECOND-PAGE source Source DEFAULT + homePostalAddress Home-Address MULTILINE + masterDSA Master-DSA HREF + slaveDSA Slave-DSA HREF + lastModifiedTime "Last modified Time" DATE + lastModifiedBy "Last modified by" DEFAULT + lastUpdateTime "Last update Time" DATE + + + +### +### sorting and display of groups of entries +### + +SORT dNSDomain Domain 8 + domain Fax 9 + rfc822MailList X.500-E-Mail-List 10 rfc822MailList + organizationalPerson Staff 1 person registeredAddress + residentialPerson Residentials 2 person registeredAddress + person Persons 3 person registeredAddress + locality Localities 7 organization + organization Organizations 5 organization + organizationalUnit "Organizational Units" 6 organization + alias Aliases 11 + country Countries 4 country + + +### +### the position of certain language-specific support-files +### + +HELPFILE tweb.help.1 + +FRIENDLYFILE ldapfriendly.1 + +HEADER tweb.header.1 +FOOTER tweb.footer.1 + +ALLOW-MSG allow.msg.1 + + +### +### some more settings for (language-specific) gateway-switches (see tweb.rc) +### + +# GW-SWITCH "ROOT" http://<my-world-relay.my-domain>:<port1>/M +# "c=<my-country-ID>" http://<my-country-relay.my-domain>:<port1>/ + + +### +### where to prevent listing and provide for searching only +### + +# SEARCH-ONLY "ou=<some-ou>, o=<my-organization>, c=<my-country-ID>" search-only.head.1 search-only.foot.1 + + +### +### modifying entries via TWEB +### + +# MODIFY person +# MODATTR personalTitle Title 1 +# organizationalStatus Status 1 +# description Description 2 +# telephoneNumber Telephone 2 +# facsimileTelephoneNumber Fax 2 +# mail "E-Mail address" 2 +# roomNumber Room 1 +# memberOfGroup Group-Member 10 +# homePostalAddress "Home address" 1 +# homePhone "Home phone" 2 +# pager Pager 2 +# info Information 2 + + diff --git a/contrib/tweb/TWEB_conFiles/tweb.lang.0.dist b/contrib/tweb/TWEB_conFiles/tweb.lang.0.dist new file mode 100644 index 0000000000000000000000000000000000000000..89f13b7b42eaf2474ba784fe2915b6f6614d5219 --- /dev/null +++ b/contrib/tweb/TWEB_conFiles/tweb.lang.0.dist @@ -0,0 +1,150 @@ +#*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +# * +# tweb.lang.0 * +# * +# Function:..Language-File for TWEB-SOFTWARE * +# * +# * +# * +# Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +# Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +# neuer Dienste, Universitaet Tuebingen, GERMANY * +# * +# ZZZZZ DDD V V * +# Creation date: Z D D V V * +# February 14 1996 Z D D V V * +# Last modification: Z D D V V * +# February 20 1997 ZZZZ DDD V * +# * +#/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/*/ +# +# $Id: tweb.lang.0.dist,v 1.6 1999/09/10 15:01:22 zrnsk01 Exp $ + +0 de +1 [not used] +2 [not used] +3 [not used] +4 [not used] +5 Kommando nicht implementiert! +6 Nicht gefunden +7 Last-Modified +8 Ändere Ergebnisse: +9 Änderungs-Ergebnisse für +10 Änderungen: +11 Fehler während Änderungs-Operation: +12 LÖSCHE alten Wert +13 von Attribut +14 Der Fehler-Kode war +15 Änderung +16 Erfolgreich ausgeführt +17 Lese diesen geänderten Wert +18 Benutzer-Passwort +19 Ändere diesen Eintrag erneut +20 Die angegebene Abfrage war nicht spezifisch genug, wodurch ein Sizelimit + überschritten wurde, wobei die ersten paar Übereinstimmungen + zurückgegeben wurden. Falls Sie nicht den gesuchten Eintrag + gefunden haben, machen Sie bitte eine genauere Abfrage, + zum Beispiel mit Vor- und Nachnamen. +21 Die Anzahl der gefundenen Einträge hat eine systemseitig + vorgegebene Obergrenze überschritten. Falls der gesuchte Eintrag + in der dargestellten Liste nicht vorhanden ist, nutzen Sie die + <STRONG>Such</STRONG>-Option, um das Gesuchte genauer zu spezifizieren. +22 Fehler +23 X.500 - WWW Fehler: +24 Beim Durchsuchen von X.500 tauchte ein Fehler auf +25 Der Fehlercode war +26 Es ist keine zusätzliche Information erhältlich. +27 Liste unterhalb von +28 aktuelle Position: +29 About +30 Suche: +31 Wir haben nicht die entsprechenden Zugriffsrechte, um hier eine globale + Suche zu starten, aber wenn Sie wissen, wen Sie suchen, benutzen Sie die + <STRONG>Such</STRONG>-Option oben mit dem Namen des + gewünschten Eintrages. +32 Habe nichts unter diesem Eintrag gefunden. Sie können den Eintrag + selbst lesen, oder eine Suche probieren ... +33 (eingeschränkte Liste +34 siehe Fußnote +35 suche in +36 Keine Suchergebnisse: +37 Habe nichts gefunden ... +38 für +39 Suchergebnisse: +40 Suchergebnisse für +41 <H2>X.500 - WWW Fehler:</H2><P>Bei der Darstellung des X.500 Eintrages + tauchte ein Fehler auf. <P>Keine bekannte Object-Klasse + für diesen Eintrag.<P> +42 Weitere Informationen +43 VORSICHT: Dies ist noch <B>EXPERIMENTELL</B>!!! +44 Geben Sie das Passwort für diesen Eintrag ein +45 wenn Sie ihn +46 übermitteln wollen +47 ÄNDERN +48 wollen +49 Fehlendes Passwort! +50 Unbekanntes Argument +51 Ändern +52 altes Passwort +53 VORSICHT: Dies ist noch EXPERIMENTELL!!! +54 Fehler in der Abfrage: Kein Wert +55 für +56 Fehler in der Abfrage: Kein alter Wert +57 <B>Fehler während der Modifikation:</B><P>Neuen Wert HINZUFÜGEN +58 zum Attribut +59 Der Fehlercode war +60 <B>Fataler Fehler:</B><BR>Konnte den alten Wert nicht zurücksetzen +61 auf Attribut +62 Setze den alten Wert wieder +63 auf Attribut +64 Mail an: +65 Aus datenschutzrechtlichen Gründen werden <strong>keine</strong> + umfangreichen Personenlisten ausgegeben. Falls die gesuchte Person + in der angezeigten Teilliste nicht vorhanden ist, verwenden Sie die + <STRONG>Such</STRONG>-Option, um die gesuchte Person genauer + zu spezifizieren.<BR> +66 Einstufige Suche +67 suche unterhalb nach... +68 SUCHEN +69 Eingabe löschen +70 Eintrag +71 Einträge +72 Einträge zuruecksetzen +73 en +74 gelöscht +75 ersetzt +76 hinzugefügt +77 Welt +78 Ja +79 Nein +80 <B>Fataler Fehler:</B><BR>Konnte den Wert nicht modifizieren +81 bei Attribut +82 http://ambix.uni-tuebingen.de/cgi-bin/selbst +83 http://ambix.uni-tuebingen.de/selbstinfo.html +84 <FORM METHOD=POST ACTION=%s>Selbsteintrag: +85 <INPUT type=hidden name="aloc" value="%s"> + <INPUT TYPE="submit" name="worker" VALUE="Angestellte"> +86 <INPUT type=hidden name="sloc" value="%s"> + <INPUT TYPE="submit" name="studie" VALUE="Studierende"> +87 </FORM> +88 Ungültige Anfrage +89 <EM>Fehlender Such-Filter!</EM> +90 <EM>Fehlender Scope!</EM> +91 [not used] +92 <EM>Fehlender Suchbegriff!</EM> <P>Bitte geben Sie einen Suchbegriff an! +93 <EM>Fehlender DN!</EM> +94 <EM>Fehlendes Passwort!</EM> +95 <EM>Unbekannte Abfrage!</EM> +96 <H1>ZUGRIFF VERWEIGERT</H1> + Die angefragten Daten stehen über diesen Server nicht zur + Verfügung!<br>Bitte benutzen Sie folgende URL: +97 <H1>ZUGRIFF VERWEIGERT</H1> +98 ...lesen +99 %s<H6>Daten erstellt durch %s <br> + © TWEB: Zentrum für Datenverarbeitung, + Universität Tübingen, Deutschland</H6> +100 BODY BGCOLOR=#ffffe0 TEXT=#000000 LINK=#0000a0 VLINK=#00a000 font-family="times serif" +101 <HR> +102 <BR><H1>Der Name Ihres Hosts ist nicht verfuegbar. Sie sehen deshalb nicht alle Daten!</H1><BR> +103 [not used] +104 Wenn Sie mehr Daten sehen wollen, schalten Sie Ihren Proxy-Server aus ! diff --git a/contrib/tweb/TWEB_conFiles/tweb.lang.1.dist b/contrib/tweb/TWEB_conFiles/tweb.lang.1.dist new file mode 100644 index 0000000000000000000000000000000000000000..0ab885765a51ec7861493884a86f7d65b897bbe3 --- /dev/null +++ b/contrib/tweb/TWEB_conFiles/tweb.lang.1.dist @@ -0,0 +1,136 @@ +#*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +# * +# tweb.lang.1 * +# * +# Function:..Language-File for TWEB-SOFTWARE * +# * +# * +# * +# Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +# Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +# neuer Dienste, Universitaet Tuebingen, GERMANY * +# * +# ZZZZZ DDD V V * +# Creation date: Z D D V V * +# February 14 1996 Z D D V V * +# Last modification: Z D D V V * +# February 20 1997 ZZZZ DDD V * +# * +#/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/*/ +# +# $Id: tweb.lang.1.dist,v 1.6 1999/09/10 15:01:22 zrnsk01 Exp $ + +0 en +1 [not used] +2 [not used] +3 [not used] +4 [not used] +5 Command not implemented! +6 Not found +7 Last-Modified +8 Modify results: +9 Modify results for +10 Changes: +11 Error during modify operation: +12 DELETE old value +13 from attribute +14 The error code was +15 change +16 successfully done +17 Read this modified entry +18 userPassword +19 Modify this entry again +20 The query you specified was not specific enough, causing a size limit to be exceeded and the first several matches found to be returned.<br>If you did not find the match you were looking for, try issuing a more specific query, for example one that contains both first and last name.<br> +21 Not all entries could be returned because a size limit was exceeded.<br>There is no way to defeat this feature, but if you know who you are looking for, try choosing the <STRONG>Search</STRONG> option listed above and specifying the name of the entry you want.<br> +22 Error +23 X.500 - WWW Error: +24 An error occurred searching X.500 +25 The error code was +26 No additional information is available. +27 Move upwards to +28 current location: +29 About +30 search: +31 We don't have the access right to do a global search here. If you know who you are looking for, try choosing the <STRONG>Search</STRONG> option listed above and specifying the name of the entry you want.<br> +32 Didn't find anything below this entry! You can read the entry itself or try a search ... +33 (restricted list +34 see below +35 search in +36 No search results: +37 Didn't find anything... +38 for +39 Search results: +40 Search results for +41 <H2>X.500 - WWW Error:</H2><P>An error occurred showing X.500 entry. <P>No known object-class for this entry.<P> +42 See more attributes +43 Beware, this is still <B>EXPERIMENTAL</B>!!! +44 Enter the password of this entry +45 if you want to +46 submit +47 MODIFY +48 it +49 Missing Password! +50 Unknown argument +51 Modify +52 oldPassword +53 Beware, this is still EXPERIMENTAL!!! +54 Error in query: No value +55 for +56 Error in query: No oldvalue +57 <B>Error during modify operation:</B><P><P>ADD new value +58 to attribute +59 The error code was +60 <B>Fatal Error:</B><BR>Couldn't reset the old value +61 to attribute +62 Reset the old value +63 to attribute +64 mailto: +65 Due to Legal Rights no extended lists of persons will be displayed. + If the requested person is not in the list shown, please use the + <STRONG>Search</STRONG>-option with a more significant personal name. + <BR> +66 Onelevel search +67 search below for... +68 SEARCH +69 DELETE INPUT +70 entry +71 entries +72 RESET Values +73 s +74 deleted +75 replaced +76 added +77 The World +78 Yes +79 No +80 <B>Fatal Error:</B><BR>Couldn't modify the value +81 at attribute +82 http://ambix.uni-tuebingen.de/cgi-bin/selbst +83 http://ambix.uni-tuebingen.de/selbstinfo.html +84 <FORM METHOD=POST ACTION=%s>Self-subscription: +85 <INPUT type=hidden name="aloc" value="%s"> + <INPUT TYPE="submit" name="worker" VALUE="Staff"> +86 <INPUT type=hidden name="sloc" value="%s"> + <INPUT TYPE="submit" name="studie" VALUE="Students"> +87 </FORM> +88 Bad request +89 <EM>Missing filter!</EM> +90 <EM>Missing scope!</EM> +91 [not used] +92 <EM>Missing search value!</EM> <P>Please specify a search value. +93 <EM>Missing DN!</EM> +94 <EM>Missing password!</EM> +95 <EM>Unknown query!</EM> +96 <H1>ACCESS DENIED</H1> + The requested data are not delivered via this server!<br> + Please use the following URL: +97 <H1>ACCESS DENIED</H1> +98 ...read it +99 %s<H6>Data composed by %s <br> + © TWEB: Zentrum fuer Datenverarbeitung, + Universitaet Tuebingen, GERMANY</H6> +100 BODY BGCOLOR=#ffffe0 TEXT=#000000 LINK=#0000a0 VLINK=#00a000 +101 <HR> +102 <BR><H1>The name of your host is not available. Therefore you don't see the whole database!</H1><BR> +103 [not used] +104 If you want to see more data, please inactivate your proxy-server ! diff --git a/contrib/tweb/TWEB_conFiles/tweb.rc.dist b/contrib/tweb/TWEB_conFiles/tweb.rc.dist new file mode 100644 index 0000000000000000000000000000000000000000..3f22c8dfed4705e9bbc28a28193e2081f3d74baa --- /dev/null +++ b/contrib/tweb/TWEB_conFiles/tweb.rc.dist @@ -0,0 +1,233 @@ +#*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +# * +# tweb.rc.... * +# * +# Function:..Ressource-File for TWEB * +# * +# * +# * +# Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +# Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +# neuer Dienste, Universitaet Tuebingen, GERMANY * +# * +# ZZZZZ DDD V V * +# Creation date: Z D D V V * +# July 26 1995 Z D D V V * +# Last modification: Z D D V V * +# January 11 1999 ZZZZ DDD V * +# * +#/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/*/ +#========================================================================== +# $Id: tweb.rc.dist,v 1.6 1999/09/10 15:01:22 zrnsk01 Exp $ + + +########################################################################## +# # +# set the following variables to your local addresses (NEEDED) # +# check also for the location of certain help files # +# and proper timeout # +# # +########################################################################## + +# the base port, TWEB is listening on; +# indizes for the languages are added to this base port number +# (e.g., TWEB with language 1 is listening on port (WEBPORT + 1)) +WEBPORT <the-base-port-tweb-should-listen-to> + +# the host and port, your x500 server (e.g., UMICH slapd) is listening on +LDAPD <the-host-running-your-ldap-server> +LDAPPORT <the-port-of-that-ldapserver> + + +#------------------------------------------------------------------------# + +# the DN, TWEB will consider it´s home, together with header and +# footer files to be display´ed at that position +# +# the BASEDN will be accessed, when NO DN is given (http://host:port/ +# the BASEDN will be stripped off from hyperlinks beeing display´ed +# access to DIT areas NOT below BASEDN will be denied, if STRICT-BASEDN +# (see tweb.rc(.dist)) is activ +# +# BEWARE: HEADER AND FOORTER FILE NAMES ARE ONLY THE BASE NAMES; THE +# CORRESPONDING WORKING FILES MUST HAVE EXTENSIONS OF '.x' +# WITH x INDICATING THE DESIRED GATEWAY LANGUAGE NUMBER (0-9) + +BASEDN "o=<my-organization>, c=<my-country-ID>" tweb-base.head tweb-base.foot + + +#------------------------------------------------------------------------# + +# assuming you have copied the binary into the TWEB_conFiles directory, +# the ETCDIR directory should be a parallel directory of the current one +ETCDIR ../LDAP_etc/ + +# the filter file directs the mode, TWEB will search for entries +# (e.g., first search input as is in attribute cn, then search +# for any one word in attributes cn and/or sn ... ) +FILTERFILE ldapfilter.conf + +# the time in secs, TWEB will try to get a connection to the x500 server +TIMEOUT 240 + + +########################################################################## +# # +# check the following variables for proper access rights # +# and handling of entry lists/legal hints # +# (NOT NEEDED FOR FIRST START-UP) # +# # +########################################################################## + +# DN and password of an x500 entry, TWEB will use, when access of the +# user to the servers data is without restrictions +# +# WEBDN "cn=<TWEB-DN-1>, o=<your-organization>, c=<your-country>" +# WEBPW <TWEB-PW-1> + +# DN (and password) of an x500 entry, TWEB will use, when access of the +# user to the servers data is restricted (e.g., external users); +# a NULL password (by not configuring) will lead to anonymous access, +# irrespective, whether the DN is given or not +# +# WEBDN2 "cn=<TWEB-DN-2>, o=<your-organization>, c=<your-country>" +# WEBPW2 <TWEB-PW-2> + +# Refuse/grant service to certain IP hosts/domains names; +# both settings will be checked when deciding deniel of service; +# the most special definition for the host given will dominate +# (settings can be given by using regular expressions, to cover more than +# one host/domain with one expression; alternatives, which should be +# or'ed must be seperated by '|') +# (continuations can be given on follow-up lines, whith no additional +# character at the end of the previous line, and an indentation by +# TAB or SPACE on the follow-up line) +# +# REFUSE some-host(\.some-sub-domain)?\.some-domain$|another-domain$| +# ^some-initial-char[0-9]+.+\.some-domain$ + +# GRANT (host1|host2|host3).*\.another-domain$ + +# When service is granted to the requesting host, allow-string/deny-string +# decide on full or restricted access to the servers data; in both cases +# one of WEBDN1/WEBDN2 (or anonymous if not configured) is used for +# accessing the server; +# ACLs on the server must be set accourding to the required visibility of +# data (see description of ACLs in the servers documentation) +# (host/domain names are given as with GRANT/REFUSE) +# +# ALLOW-STRING my-domain$ +# DENY-STRING some-special-host/sub-domain-in-my-domain\.my-domain$ + +# Consider WWW proxies as not authorized to get un-restricted access +# NO-PROXY + +# Consider the explicit list of proxies as authorized to get full access +# (the list is as colon-seperated list of host names) +# ALLOW-PROXY proxy.in.my.domain:some-proxy.in.another.domain + +# Refuse access to DNs, outside the scope of TWEBs BASEDN +# (this is necessary, if no referral mechanism is working on the +# x500 server level; e.g., with slapd in the UMICH package) +# STRICT-BASEDN + +# Activate anti-hacking code: count access from a range of IP adresses +# (IP-Group) to the gateway during a timeslice (randomly selected between +# a minimum and maximum number of secs); if the count exceeds a pre- +# defined maximum, refuse service for a certain number of timeslices; +# after that resume service for the IP-Group +# Print statistics for number of accesses from all IP-Groups to file, +# at regular intervalls +# +# COMREFUSE TMIN TMAX MAX_ACCEPT SUSPEND_CYCLE STAT_CYCLE STAT_FILE +COMREFUSE 100 200 40 12 43200 /LDAP/ldap-3.0/tweb-1.0/hack-stats + +#------------------------------------------------------------------------# + +# The maximum number of entries display'ed on any one HTML page +MAXCOUNT 2000 + +# During searching/browsing restrict the number of person entries to the +# given number; numbers apply to each of the person groups given by the +# SORT parameter +# STRICT means, even allowed access will be restricted in numbers +# NO-BROWSE means, during browsing no person entries are shown at all +# MAX-PERSON 5 STRICT NO-BROWSE + +# List of (parts of ) RDNs, which should not be display'ed +# For the current release, strings are seperated by BLANK, with forced +# matching to the beginning or end of an RDN signalled by '|'; +# in a future release, this will be replaced by regular expressions, +# very like as in GRANT/REFUSE and beasts +NO-SHOW-RDN "|cn=Dummy| netz| LDAP-SAP Mail500|" + + +# Print a legal message for restricted users; +# normally, this message is printed at the end of the HTML page, +# with ON-TOP, the message can be printed near the top of the page +# +# LEGAL ON-TOP + + +########################################################################## +# # +# configure TWEB gateway-switching # +# # +########################################################################## + +# Gateway-switching is an original feature of the TWEB, www-x500-gateway. +# Switching enables TWEB to generate hyper-links, that are directed towards +# other well-known gateways. Following those hyper-links will lead the +# user to those gateways, effectively balancing the load between a net +# of gateways. Another benefit is the 'Corporate Identity' each gateway +# can implement for an organizations own directory data. +# +# Gateway-switching can be configured statically, in the config files +# tweb.rc and/or tweb.conf.? , or dynamically, via hints in the +# directory data to be display'ed. +# +# Select dynamic gateway-switching: TWEB will look for labeleduri +# attributes within each entry to be display'ed as a hyper-link +# before constructing the host-part of the hyper-link URL; the +# labelleduri attribut must follow the syntax: +# <base-url-of-the-other-gateway> <some-label> (gw[-<language-key>]) +# The DN of the entry will be appended to the base-url, if the language +# selection matches, or no specific selection is given (gw) +# +DYNAMIC-GW + +# Configure static gateway switches; they may be replaced at run-time by +# dynamic switches (in tweb.rc, gateways, which only support one language +# are given; gatways supporting more languages are defined in the +# tweb.conf.? files) +GW-SWITCH "l=DFN,c=DE" http://ambix.uni-tuebingen.de:8889/ + + +########################################################################## +# # +# some miscelleneous configuration parameters # +# # +########################################################################## + +# the labelling of buttons/links leading to gateways with other languages +LANGUAGE Deutsch + English + +# the hierarchy above the current DIT position is presented as a +# pull down menu and an action button, or as a list of hyperlinks +PULL-DOWN-MENUS + +# entries are kept for some time in a WWW browser´s or proxy´s cache, +# before expiring +CACHE-EXPIRE-DEFAULT 900 + +# digits at the end of RDNs (e.g., to make RDNs unique) are stripped +# off before displaying; in the config parameter a list of object +# classes with stripping in the RDN parts is given +# STRIP-PIN |toc_profs|person|toc_primas|toc_cperson|toc_funcs|toc_pextra| + +# when MODIFY is configured (in tweb.conf.x), entries belonging to +# the object class(es) given here can NOT be modified +# NO-MODIFY |toc_primas| + + diff --git a/contrib/tweb/Versiongw.c b/contrib/tweb/Versiongw.c new file mode 100644 index 0000000000000000000000000000000000000000..3b9bb2dca8cbc5375eb6a9d0d5897e43838d0c03 --- /dev/null +++ b/contrib/tweb/Versiongw.c @@ -0,0 +1,41 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* Versiongw.c * +* * +* Function:..File for TWEB-SOFTWARE * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* February 13 1996 Z D D V V * +* Last modification: Z D D V V * +* August 26 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: Versiongw.c,v 1.6 1999/09/10 15:01:16 zrnsk01 Exp $ + * + */ + +/* + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of Tuebingen, Gremany. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. This software + * is provided ``as is'' without express or implied warranty. + */ + +char version[] = "TWEB 2.3.4 (%WHEN%)"; +char Version[] = " TWEB 2.3.4 (%WHEN%)\t%WHOANDWHERE%"; +char copyright[] = "TWEB Version 2.3.4"; + +char sccsid[] = "@(#) TWEB 2.3.4 - 1995-1999, University of Tuebingen, DE"; + + diff --git a/contrib/tweb/ch_malloc.c b/contrib/tweb/ch_malloc.c new file mode 100644 index 0000000000000000000000000000000000000000..1386921d0e3ef7bba206cedb437ffb706084d68c --- /dev/null +++ b/contrib/tweb/ch_malloc.c @@ -0,0 +1,85 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* ch_malloc.c * +* * +* Function:..Alloc-Functions with Error-Handling * +* * +* from LDAP3.2 University of Michigan * +* * +* Patch: unsigned long --> size_t fuer size-Parameter * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* April 16 1996 Z D D V V * +* Last modification: Z D D V V * +* December 31 1998 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: ch_malloc.c,v 1.6 1999/09/10 15:01:16 zrnsk01 Exp $ + * + */ + +#include "tgeneral.h" +#include "tglobal.h" + +#include "ch_malloc_exp.h" +#include "support_exp.h" + + +/* ch_malloc.c - malloc routines that test returns from malloc and friends */ + +PUBLIC char * ch_malloc( size ) +size_t size; +{ + char *new; + + if ( (new = (char *) calloc(1, size )) == NULL ) { + if (dosyslog) syslog( LOG_INFO, "malloc of %d bytes failed\n", size ); + exit_tweb( 1 ); + } + + return( new ); +} +/* end of function: ch_malloc */ + +PUBLIC char * ch_realloc( block, size ) +char *block; +size_t size; +{ + char *new; + + if ( block == NULL ) { + return( ch_malloc( size ) ); + } + + if ( (new = (char *) realloc( block, size )) == NULL ) { + if (dosyslog) syslog( LOG_INFO, "realloc of %d bytes failed\n", size ); + exit_tweb( 1 ); + } + + return( new ); +} +/* end of function: ch_realloc */ + +PUBLIC char * ch_calloc( nelem, size ) +size_t nelem; +size_t size; +{ + char *new; + + if ( (new = (char *) calloc( nelem, size )) == NULL ) { + if (dosyslog) syslog( LOG_INFO, "calloc of %d elems of %d bytes failed\n", + nelem, size ); + exit_tweb( 1 ); + } + + return( new ); +} +/* end of function: ch_calloc */ diff --git a/contrib/tweb/ch_malloc_exp.h b/contrib/tweb/ch_malloc_exp.h new file mode 100644 index 0000000000000000000000000000000000000000..54ef4b8865b5f455a8bc0e75f00be08e41f4a90a --- /dev/null +++ b/contrib/tweb/ch_malloc_exp.h @@ -0,0 +1,34 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* ch_malloc_exp.h * +* * +* Function:..File for TWEB-SOFTWARE * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* April 16 1996 Z D D V V * +* Last modification: Z D D V V * +* November 21 1996 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: ch_malloc_exp.h,v 1.6 1999/09/10 15:01:16 zrnsk01 Exp $ + * + */ + +#ifndef _CH_MALLOC_EXP_ +#define _CH_MALLOC_EXP_ + +PUBLIC char * ch_malloc(); +PUBLIC char * ch_realloc(); +PUBLIC char * ch_calloc(); + + +#endif /* _CH_MALLOC_EXP_ */ diff --git a/contrib/tweb/charray.c b/contrib/tweb/charray.c new file mode 100644 index 0000000000000000000000000000000000000000..c6de4689e101bb3768db2426d925b2f53682cc7a --- /dev/null +++ b/contrib/tweb/charray.c @@ -0,0 +1,179 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* charray.c.. * +* * +* Function:..Array-Handling-Functions * +* * +* from LDAP3.2 University of Michigan * +* * +* Patch: NULL-Pointers are caught in Arrays/Strings * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* April 16 1996 Z D D V V * +* Last modification: Z D D V V * +* December 21 1998 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: charray.c,v 1.6 1999/09/10 15:01:16 zrnsk01 Exp $ + * + */ + +#include "tgeneral.h" +#include "charray_exp.h" +#include "ch_malloc_exp.h" + +/* charray.c - routines for dealing with char * arrays */ + + +PUBLIC void charray_add( a, s ) +char ***a; +char *s; +{ + int n; + + if ( s == NULL ) + return; + + if ( *a == NULL ) { + *a = (char **) ch_malloc( 2 * sizeof(char *) ); + n = 0; + } else { + for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) { + ; /* NULL */ + } + + *a = (char **) ch_realloc( (char *) *a, + (n + 2) * sizeof(char *) ); + } + + (*a)[n++] = strdup(s); + (*a)[n] = NULL; +} +/* end of function: charray_add */ + +PUBLIC void charray_merge( a, s ) +char ***a; +char **s; +{ + int i, n, nn; + + if ( s == NULL ) + return; + + for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) { + ; /* NULL */ + } + + for ( nn = 0; s[nn] != NULL; nn++ ) { + ; /* NULL */ + } + + *a = (char **) ch_realloc( (char *) *a, (n + nn + 1) * sizeof(char *) ); + + for ( i = 0; i < nn; i++ ) { + (*a)[n + i] = s[i]; + } + (*a)[n + nn] = NULL; +} +/* end of function: charray_merge */ + +PUBLIC void charray_free( array ) +char **array; +{ + char **a; + + if ( array == NULL ) { + return; + } + + for ( a = array; *a != NULL; a++ ) { + if ( *a != NULL ) { + free( *a ); + } + } + free( (char *) array ); +} +/* end of function: charray_free */ + +PUBLIC int charray_inlist( a, s ) + char **a; + char *s; +{ + int i; + + if (( a == NULL ) || ( s == NULL )) + return( 0 ); + + for ( i = 0; a[i] != NULL; i++ ) { + if ( strcasecmp( s, a[i] ) == 0 ) { + return( 1 ); + } + } + + return( 0 ); +} +/* end of function: charray_inlist */ + +PUBLIC char ** charray_dup( a ) +char **a; +{ + int i; + char **new; + + if ( a == NULL ) + return( NULL ); + + for ( i = 0; a[i] != NULL; i++ ) + ; /* NULL */ + + new = (char **) ch_malloc( (i + 1) * sizeof(char *) ); + + for ( i = 0; a[i] != NULL; i++ ) { + new[i] = strdup( a[i] ); + } + new[i] = NULL; + + return( new ); +} +/* end of function: charray_dup */ + +PUBLIC char ** str2charray( str, brkstr ) +char *str; +char *brkstr; +{ + char **res; + char *s; + int i; + char *str1; + + if (( str == NULL ) || ( brkstr == NULL )) return( (char **) NULL ); + + str1 = strdup(str); + i = 1; + for ( s = str1; *s; s++ ) { + if ( strchr( brkstr, *s ) != NULL ) { + i++; + } + } + + res = (char **) ch_malloc( (i + 1) * sizeof(char *) ); + i = 0; + for ( s = strtok( str1, brkstr ); s != NULL; s = strtok( NULL, + brkstr ) ) { + res[i++] = strdup( s ); + } + res[i] = NULL; + + free(str1); + return( res ); +} +/* end of function: str2charray */ diff --git a/contrib/tweb/charray_exp.h b/contrib/tweb/charray_exp.h new file mode 100644 index 0000000000000000000000000000000000000000..3f4a67141fe9f0c792d44754646454fabbd88a92 --- /dev/null +++ b/contrib/tweb/charray_exp.h @@ -0,0 +1,37 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* charray_exp.h * +* * +* Function:..File for TWEB-SOFTWARE * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* April 16 1996 Z D D V V * +* Last modification: Z D D V V * +* November 21 1996 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: charray_exp.h,v 1.6 1999/09/10 15:01:16 zrnsk01 Exp $ + * + */ + +#ifndef _CHARRAY_EXP_ +#define _CHARRAY_EXP_ + +PUBLIC void charray_add(); +PUBLIC void charray_merge(); +PUBLIC void charray_free(); +PUBLIC int charray_inlist(); +PUBLIC char ** charray_dup(); +PUBLIC char ** str2charray(); + + +#endif /* _CHARRAY_EXP_ */ diff --git a/contrib/tweb/checkclient.c b/contrib/tweb/checkclient.c new file mode 100644 index 0000000000000000000000000000000000000000..45f2edf434ecc3708b3cab3b740fbda027117300 --- /dev/null +++ b/contrib/tweb/checkclient.c @@ -0,0 +1,258 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* checkclient.c * +* * +* Function:..Client-Check-Funktions * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* March 7 1996 Z D D V V * +* Last modification: Z D D V V * +* March 19 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: checkclient.c,v 1.6 1999/09/10 15:01:16 zrnsk01 Exp $ + * + */ + +#include "tgeneral.h" +#include "tglobal.h" +#include "init_exp.h" +#include "charray_exp.h" +#include "checkclient.h" +#include "regular_exp.h" + +PRIVATE int check4access (host, glob) +char *host; +GLOB_STRUCT *glob; +/* + * check if host ends in a valid domain. + * return OK if so, NOTOK otherwise + */ +{ + return( + (glob->allow_string ? checkad(host, glob->comp_allow, glob) : OK) && + (glob->deny_string ? !checkad(host, glob->comp_deny, glob) : OK)); + +} +/* end of function: check4access */ + + +PRIVATE int checkad (host, string, glob) +char *host; +regexp *string; +GLOB_STRUCT *glob; +{ + char nhost[BUFSIZ]; + + strcpy(nhost, host ? host : "unknown.xxx"); + return( tweb_regexec( string, nhost )); + +} +/* end of function: checkad */ + +/* Analyse Web-Client-Type / proxy + Log-Message */ + +PUBLIC void checkwwwclient (fp, ip_addr, ip_port, hp, glob) +FILE *fp; +char *ip_addr; +unsigned int ip_port; +struct hostent *hp; +GLOB_STRUCT *glob; +{ + char in[BUFSIZ]; + char agent[BUFSIZ], via[BUFSIZ]; + char *host = hp ? hp->h_name : "unknown"; + + *via = *agent = '\0'; + + if(!((glob->grant ? checkad(host, glob->comp_grant, glob) : OK) && + (glob->refuse ? !checkad(host, glob->comp_refuse, glob) : OK))){ + + if (dosyslog) + syslog (LOG_INFO, "%s REFUSED <%08d>", + glob->server_connection_msg, glob->svc_cnt); + fflush(fp); + if (http == 1) PRINT_HTML_HEADER; + fprintf( fp, HTML_HEAD_TITLE, "ACCESS DENIED", glob->la[100]); + disp_file(glob, glob->header, fp); + fprintf(fp, "%s", glob->la[97]); + disp_file(glob, glob->footer, fp); + PRINT_HTML_FOOTER; + close_ldap_connections(glob); + exit_tweb(0); + } + + glob->is_proxy = FALSE; + while(fgets( in, BUFSIZ-1, fp ) && *trimright(in, WSPACE) ) { + if(strstr(in, "User-Agent:")){ + strcpy(agent, in); + if(strstr(str_tolower(in), PROXY_TOKEN1) || + strstr(in, PROXY_TOKEN2)) + glob->is_proxy = TRUE; + } + if(strstr(in, "Via:")){ + strcpy(via, in); + glob->is_proxy = TRUE; + } + } + if (dosyslog){ + char useragent[BUFSIZ]; + + sprintf(useragent, "%s (%s,%u) %s", + *agent ? agent : "User-Agent: unknown", + ip_addr, ip_port, via); + glob->user_agent_msg = strdup(useragent); + } + + /* check if access is allowed ... */ + + glob->allowed = + ( hp + && ((check4access(str_tolower(hp->h_name), glob) == OK)) + && !( glob->no_proxy && glob->is_proxy + && !charray_inlist(glob->allow_proxy, hp->h_name) + ) + ); +} + +/* end of function: checkwwwclient */ + +PUBLIC void decide_access(glob) +GLOB_STRUCT *glob; +{ + + if(!glob->allowed) { + /* access from a non allowed computer + ==> put webdn/webpw on a alternative value (if existant) */ + glob->webdn = glob->webdn2; + glob->webpw = glob->webpw2; + glob->noauth = TRUE; + + if (dosyslog) syslog (LOG_INFO, "%s DENIED <%08d>", + glob->server_connection_msg, glob->svc_cnt); + + } else { + + /* if allowed and not strict: list persons without limits */ + if (!glob->strict) glob->max_person = 0; + + if (dosyslog) syslog (LOG_INFO, "%s ALLOWED <%08d>", + glob->server_connection_msg, glob->svc_cnt); + } + if (dosyslog) syslog (LOG_INFO, "%s <%08d>", + glob->user_agent_msg, glob->svc_cnt); + + /* non configured max-person means full listing */ + if (!glob->max_person) glob->max_person = 100000; + + /* if result-lists shall be restricted: configure display of + privacy-message */ + glob->legal = glob->legal && (!glob->allowed || glob->strict); + + /* if browsing should be restricted: configure no_browse-variable */ + glob->no_browse = glob->no_browse && + (glob->noauth || glob->strict); + +} + +/* end of function: decide_access */ + +/* Read ip_refuse dat_file and build up the data structure */ + +PUBLIC void get_ip_refuse_clients(glob) +GLOB_STRUCT *glob; +{ + if ( glob->ip_refuse ) { + + FILE *rfp; + char inLine[BUFSIZ]; + char *inLineP; + size_t buflen = REFU_BUFSIZ; + size_t curlen = (size_t) 1; + + if(!(rfp = fopen(glob->ip_refuse->dat_file, "r"))) { + return; + } + + if ( glob->ip_refuse->refu_str ) free( glob->ip_refuse->refu_str ); + glob->ip_refuse->refu_str = ch_calloc( 1, REFU_BUFSIZ ); + *glob->ip_refuse->refu_str = '&'; + + while(fgets(inLine, BUFSIZ-1, rfp)) { + int inLen; + + if ( ( inLineP = strchr( inLine, '#' ) )) *inLineP = '\0'; + inLineP = trim(inLine, " \t\n"); + if ( *inLineP == '\0' ) continue; + + inLen = strlen( inLineP ); + if ( !( curlen + inLen + 1 < buflen )) { + + glob->ip_refuse->refu_str = + ch_realloc( glob->ip_refuse->refu_str, + buflen + REFU_BUFSIZ ); + buflen += REFU_BUFSIZ; + + } + + sprintf( glob->ip_refuse->refu_str, "%s%s&", + glob->ip_refuse->refu_str, inLineP ); + + curlen += inLen; + + } + fclose( rfp ); + + } +} /* get_ip_refuse_clients */ + + +/* Routine needed to initialize structure in init.c */ + +/* Test the incomming IP address for denial */ + +PUBLIC int +check_ip_denial( ip_connection, glob ) +struct sockaddr_in *ip_connection; +GLOB_STRUCT *glob; +{ + int res = OK; + + if ( glob->ip_refuse ) { + char ip_address[18]; + + sprintf( ip_address, "&%s&", inet_ntoa( ip_connection->sin_addr )); + if ( strstr( glob->ip_refuse->refu_str, ip_address )) + res = NOTOK; + + } + + return( res ); + +} /* check_ip_denial */ + + +/* re-read IP-REFUSE file if necessary */ + +PUBLIC void +re_readIPrefuse( glob ) +GLOB_STRUCT *glob; +{ + static int ip_refuse_reload = 0; + + if ( glob->ip_refuse && + !( ++ip_refuse_reload % glob->ip_refuse->rereadcycle )) { + get_ip_refuse_clients( glob ); + } + +} /* re_readIPrefuse */ + diff --git a/contrib/tweb/checkclient.h b/contrib/tweb/checkclient.h new file mode 100644 index 0000000000000000000000000000000000000000..ecdd9eb6340ac20ec903d1dd8436c79496389c49 --- /dev/null +++ b/contrib/tweb/checkclient.h @@ -0,0 +1,41 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* checkclient.h * +* * +* Function:..File for TWEB-SOFTWARE * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* March 18 1996 Z D D V V * +* Last modification: Z D D V V * +* March 19 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: checkclient.h,v 1.6 1999/09/10 15:01:16 zrnsk01 Exp $ + * + */ +#include "checkclient_exp.h" +#include "regular_exp.h" +#include "support_exp.h" +#include "x500_exp.h" +#include "charray_exp.h" +#include "ch_malloc_exp.h" + +#ifndef _CHECKCLIENT_ +#define _CHECKCLIENT_ + +#define PROXY_TOKEN1 " via " +#define PROXY_TOKEN2 "gateway" + +PRIVATE int checkad(); +PRIVATE int check4access(); + +#endif /* _CHECKCLIENT_ */ diff --git a/contrib/tweb/checkclient_exp.h b/contrib/tweb/checkclient_exp.h new file mode 100644 index 0000000000000000000000000000000000000000..6b71b334c87134523f13e98a2e0e1dbaaff7ab4e --- /dev/null +++ b/contrib/tweb/checkclient_exp.h @@ -0,0 +1,35 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* checkclient_exp.h * +* * +* Function:..File for TWEB-SOFTWARE * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* March 18 1996 Z D D V V * +* Last modification: Z D D V V * +* March 19 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: checkclient_exp.h,v 1.6 1999/09/10 15:01:16 zrnsk01 Exp $ + * + */ + +#ifndef _CHECKCLIENT_EXP_ +#define _CHECKCLIENT_EXP_ + +PUBLIC void checkwwwclient(); +PUBLIC void decide_access(); +PUBLIC void get_ip_refuse_clients(); +PUBLIC int check_ip_denial(); +PUBLIC void re_readIPrefuse(); + +#endif /* _CHECKCLIENT_EXP_ */ diff --git a/contrib/tweb/dn.c b/contrib/tweb/dn.c new file mode 100644 index 0000000000000000000000000000000000000000..7518372cbefc0c84dbf828875a0e3be9ecdcb2ba --- /dev/null +++ b/contrib/tweb/dn.c @@ -0,0 +1,200 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* dn.c....... * +* * +* Function:..DN-Handling-Functions * +* * +* from LDAP3.2 University of Michigan * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* April 24 1996 Z D D V V * +* Last modification: Z D D V V * +* December 14 1996 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: dn.c,v 1.6 1999/09/10 15:01:16 zrnsk01 Exp $ + * + */ + +/* dn.c - routines for dealing with distinguished names */ + +#include "tgeneral.h" +#include "strng_exp.h" +#include "dn.h" + +/* + * dn_normalize - put dn into a canonical format. the dn is + * normalized in place, as well as returned. + */ + +PUBLIC char * dn_normalize( dn ) +char *dn; +{ + char *d, *s; + int state, gotesc; + + /* Debug( LDAP_DEBUG_TRACE, "=> dn_normalize \"%s\"\n", dn, 0, 0 ); */ + + gotesc = 0; + state = B4TYPE; + for ( d = s = dn; *s; s++ ) { + switch ( state ) { + case B4TYPE: + if ( ! SPACE( *s ) ) { + state = INTYPE; + *d++ = *s; + } + break; + case INTYPE: + if ( *s == '=' ) { + state = B4VALUE; + *d++ = *s; + } else if ( SPACE( *s ) ) { + state = B4EQUAL; + } else { + *d++ = *s; + } + break; + case B4EQUAL: + if ( *s == '=' ) { + state = B4VALUE; + *d++ = *s; + } else if ( ! SPACE( *s ) ) { + /* not a valid dn - but what can we do here? */ + *d++ = *s; + } + break; + case B4VALUE: + if ( *s == '"' ) { + state = INQUOTEDVALUE; + *d++ = *s; + } else if ( ! SPACE( *s ) ) { + state = INVALUE; + *d++ = *s; + } + break; + case INVALUE: + if ( !gotesc && SEPARATOR( *s ) ) { + while ( SPACE( *(d - 1) ) ) + d--; + state = B4TYPE; + if ( *s == '+' ) { + *d++ = *s; + } else { + *d++ = ','; + } + } else if ( gotesc && !NEEDSESCAPE( *s ) && + !SEPARATOR( *s ) ) { + *--d = *s; + d++; + } else { + *d++ = *s; + } + break; + case INQUOTEDVALUE: + if ( !gotesc && *s == '"' ) { + state = B4SEPARATOR; + *d++ = *s; + } else if ( gotesc && !NEEDSESCAPE( *s ) ) { + *--d = *s; + d++; + } else { + *d++ = *s; + } + break; + case B4SEPARATOR: + if ( SEPARATOR( *s ) ) { + state = B4TYPE; + *d++ = *s; + } + break; + default: + +#if defined LDAP_VENDOR_NAME && defined LDAP_API_VERSION +# if LDAP_API_VERSION > 2001 && LDAP_API_VERSION < 2010 + +# define LDAP_DEBUG_ANY 0xffff + + if ( ldap_debug & LDAP_DEBUG_ANY ) + fprintf( stderr, "dn_normalize - unknown state %d\n", state ); + + if ( ldap_syslog & LDAP_DEBUG_ANY ) + syslog( ldap_syslog_level, + "dn_normalize - unknown state %d\n", state ); + +# endif +#else + Debug( LDAP_DEBUG_ANY, + "dn_normalize - unknown state %d\n", state, 0, 0 ); +#endif + + break; + } + if ( *s == '\\' ) { + gotesc = 1; + } else { + gotesc = 0; + } + } + *d = '\0'; + + /* Debug( LDAP_DEBUG_TRACE, "<= dn_normalize \"%s\"\n", dn, 0, 0 ); */ + return( dn ); +} +/* end of function: dn_normalize */ + +/* + * dn_normalize_case - put dn into a canonical form suitable for storing + * in a hash database. this involves normalizing the case as well as + * the format. the dn is normalized in place as well as returned. + */ + +PUBLIC char * dn_normalize_case( dn ) +char *dn; +{ + + /* normalize format */ + dn_normalize( dn ); + + /* normalize case */ + str_toupper( dn ); + + return( dn ); +} +/* end of function: dn_normalize_case */ + +/* + * dn_issuffix - tells whether suffix is a suffix of dn. both dn + * and suffix must be normalized. + */ + +PUBLIC int dn_issuffix( dn, suffix ) +char *dn; +char *suffix; +{ + int dnlen, suffixlen; + + if ( dn == NULL ) { + return( 0 ); + } + + suffixlen = strlen( suffix ); + dnlen = strlen( dn ); + + if ( suffixlen > dnlen ) { + return( 0 ); + } + + return( strcasecmp( dn + dnlen - suffixlen, suffix ) == 0 ); +} +/* end of function: dn_issuffix */ + diff --git a/contrib/tweb/dn.h b/contrib/tweb/dn.h new file mode 100644 index 0000000000000000000000000000000000000000..fa00fa9d62c34a14b5175379604b328b4c6bee71 --- /dev/null +++ b/contrib/tweb/dn.h @@ -0,0 +1,43 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* dn.h....... * +* * +* Function:..Header-Datei fuer TWEB-Software * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* April 24 1996 Z D D V V * +* Last modification: Z D D V V * +* November 21 1996 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: dn.h,v 1.6 1999/09/10 15:01:16 zrnsk01 Exp $ + * + */ + +#ifndef _DN_ +#define _DN_ + +#define DNSEPARATOR(c) (c == ',' || c == ';') +#define SEPARATOR(c) (c == ',' || c == ';' || c == '+') +#define SPACE(c) (c == ' ' || c == '\n') +#define NEEDSESCAPE(c) (c == '\\' || c == '"') +#define B4TYPE 0 +#define INTYPE 1 +#define B4EQUAL 2 +#define B4VALUE 3 +#define INVALUE 4 +#define INQUOTEDVALUE 5 +#define B4SEPARATOR 6 + +#include "dn_exp.h" + +#endif /* _DN_ */ diff --git a/contrib/tweb/dn_exp.h b/contrib/tweb/dn_exp.h new file mode 100644 index 0000000000000000000000000000000000000000..8fc90975ae5f3502305c31db3dbffb2cbbb75d57 --- /dev/null +++ b/contrib/tweb/dn_exp.h @@ -0,0 +1,33 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* dn_exp.h... * +* * +* Function:..Header-Datei fuer TWEB-Software * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* April 24 1996 Z D D V V * +* Last modification: Z D D V V * +* November 21 1996 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: dn_exp.h,v 1.6 1999/09/10 15:01:17 zrnsk01 Exp $ + * + */ + +#ifndef _DN_EXP_ +#define _DN_EXP_ + +PUBLIC char * dn_normalize(); +PUBLIC char * dn_normalize_case(); +PUBLIC int dn_issuffix(); + +#endif /* _DN_EXP_ */ diff --git a/contrib/tweb/doc/Presentation/DANTE-01-99.ps b/contrib/tweb/doc/Presentation/DANTE-01-99.ps new file mode 100644 index 0000000000000000000000000000000000000000..1c6f9315fd120bb1bec7621b35850a2c72583221 --- /dev/null +++ b/contrib/tweb/doc/Presentation/DANTE-01-99.ps @@ -0,0 +1,7072 @@ +%!PS-Adobe-3.0 +%XpPrinter-Model: HP LaserJet 4L (C2003) PostScript Cartridge +%%Creator: Wind/U Xprinter Version 3.1.0 (linux) (Compile Date: Aug 27 1998 18:14:52) (XpDummyUser) +%%Title: +%%CreationDate:Tue Jan 19 09:07:58 1999 +%%DocumentSuppliedResources: (atend) +%%Pages: (atend) +%%LanguageLevel: 1 +%%EndComments +%%BeginProlog +/XPrinterDict dup 200 dict def load begin +/bdf{bind def}bind def +/ldf{load def}bdf +/m/rmoveto ldf +/l2/rlineto ldf +/gs/gsave ldf +/gr/grestore ldf +/np/newpath ldf +/sv/save ldf +/rs/restore ldf +/tl/translate ldf +/mt/matrix ldf +/l/length ldf +/z/dict ldf +/d/def ldf +/e/exch ldf +/a/array ldf +/ac/arc ldf +/an/arcn ldf +/b/begin ldf +/pi/putinterval ldf +/t/moveto ldf +/lo/lineto ldf +/st/stroke ldf +/p/add ldf +/s/sub ldf +/c/mul ldf +/v/div ldf +/cp/closepath ldf +/sl/scale ldf +/ff/findfont ldf +/mf/makefont ldf +/sf/setfont ldf +/f/fill ldf +/sw/setlinewidth ldf +/sc/setlinecap ldf +/sj/setlinejoin ldf +/sg/setgray ldf +/ski/ISOLatin1Encoding where{pop true}{false}ifelse d +/fcd{ff dup l z b{1 index /FID ne{d}{pop pop}ifelse}forall /Encoding ISOLatin1Encoding d currentdict end}bdf +/fdf{e definefont pop}bdf +/sdt 22 z d +sdt b +/tpm mt d +/tpt mt d +/tps mt d +/cps +{/pr2 e cvlit d +/pr1 e cvlit d +/npc pr1 l pr2 l p a d +npc 0 pr1 pi +npc pr1 l pr2 pi +npc cvx +}bdf +/rmx mt d +/frs +{72 0 rmx defaultmatrix dtransform +/yres e d /xres e d +xres dup c yres dup c p sqrt +}bdf +end +/sus +{sdt b +/spf e d +/sag e d +/ces e d +300 ces v sag /spf load +setscreen +end +}bdf +/spt 18 z d +spt b +/bts +{/ybit e d /xbit e d +/byv bstr ybit bwd c xbit 8 idiv +p get d +/mask 1 7 xbit 8 mod s bitshift d +byv mask and 0 ne +}bdf +end +/bsf +{spt b +/y e d /x e d +/xix x 1 p 2 v bpx c cvi d +/yix y 1 p 2 v bpy c cvi d +xix yix bts +{/onb onb 1 p d 1} +{/ofb ofb 1 p d 0} +ifelse +end +}bdf +/setpattern +{spt b +/csz e d +/agl e d +/bwd e d +/bpy e d +/bpx e d +/bstr e d +/onb 0 d /ofb 0 d +csz agl /bsf load +sus +{ }settransfer +ofb ofb onb p v setgray +end +}bdf +/picstr 500 string d +/inch{72 c}bdf +/DP{gs np 0 360 ac cp f gr}bdf +/DL{gs np t lo st gr}bdf +/RGB{setrgbcolor}bdf +/C{gs t show gr}bdf + +/ren 12 z d +/REn +{ren b +/nwc e d +/nwf e d +/bft e d +/bfd bft ff d +/nf bfd maxlength z d +bfd +{e dup /FID ne +{dup /Encoding eq +{e dup l a copy +nf 3 1 roll put} +{e nf 3 1 roll put} +ifelse +} +{pop pop} +ifelse +}forall +nf /FontName nwf put +nwc aload pop +nwc l 2 idiv +{nf /Encoding get 3 1 roll put} +repeat +nwf nf definefont pop +end +}d +/rots{gs t rotate show gr}bdf + +%%EndProlog +%%BeginSetup +%%BeginFeature: *PageRegion A4 + a4 +%%EndFeature +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +/#copies 1 def +sv +90 rotate +1.00 -1.00 sl +18.96 18.00 tl +%%EndPageSetup +%%BoundingBox: (atend) +gs +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.72 537.84 t 66.72 25.20 lo 66.72 25.20 lo 66.72 537.84 lo 66.72 537.84 lo eofill st gr +gs np 66.72 537.84 t 66.72 25.20 lo 68.64 25.20 lo 68.64 537.84 lo 66.72 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.122 0.122 0.122 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 68.64 537.84 t 68.64 25.20 lo 70.80 25.20 lo 70.80 537.84 lo 68.64 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.247 0.247 0.247 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 70.80 537.84 t 70.80 25.20 lo 72.96 25.20 lo 72.96 537.84 lo 70.80 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.373 0.373 0.373 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 72.96 537.84 t 72.96 25.20 lo 75.12 25.20 lo 75.12 537.84 lo 72.96 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.498 0.498 0.498 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 75.12 537.84 t 75.12 25.20 lo 77.28 25.20 lo 77.28 537.84 lo 75.12 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.624 0.624 0.624 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 77.28 537.84 t 77.28 25.20 lo 79.44 25.20 lo 79.44 537.84 lo 77.28 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.749 0.749 0.749 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 79.44 537.84 t 79.44 25.20 lo 81.60 25.20 lo 81.60 537.84 lo 79.44 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 98.88 lo 66.96 98.88 lo 66.96 98.88 lo eofill st gr +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 100.80 lo 66.96 100.80 lo 66.96 98.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.110 0.110 0.110 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 100.80 t 741.60 100.80 lo 741.60 102.72 lo 66.96 102.72 lo 66.96 100.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.220 0.220 0.220 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 102.72 t 741.60 102.72 lo 741.60 104.88 lo 66.96 104.88 lo 66.96 102.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.333 0.333 0.333 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 104.88 t 741.60 104.88 lo 741.60 106.80 lo 66.96 106.80 lo 66.96 104.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.443 0.443 0.443 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 106.80 t 741.60 106.80 lo 741.60 108.72 lo 66.96 108.72 lo 66.96 106.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.553 0.553 0.553 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 108.72 t 741.60 108.72 lo 741.60 110.88 lo 66.96 110.88 lo 66.96 108.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.667 0.667 0.667 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 110.88 t 741.60 110.88 lo 741.60 112.80 lo 66.96 112.80 lo 66.96 110.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.776 0.776 0.776 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 112.80 t 741.60 112.80 lo 741.60 114.96 lo 66.96 114.96 lo 66.96 112.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 494.64 lo 94.08 494.64 lo 94.08 494.64 lo eofill st gr +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 496.56 lo 94.08 496.56 lo 94.08 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 496.56 t 395.52 496.56 lo 395.52 498.72 lo 94.08 498.72 lo 94.08 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 498.72 t 395.52 498.72 lo 395.52 500.64 lo 94.08 500.64 lo 94.08 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 500.64 t 395.52 500.64 lo 395.52 502.80 lo 94.08 502.80 lo 94.08 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 502.80 t 395.52 502.80 lo 395.52 504.72 lo 94.08 504.72 lo 94.08 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 504.72 t 395.52 504.72 lo 395.52 506.88 lo 94.08 506.88 lo 94.08 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 506.88 t 395.52 506.88 lo 395.52 509.04 lo 94.08 509.04 lo 94.08 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 509.04 t 395.52 509.04 lo 395.52 510.96 lo 94.08 510.96 lo 94.08 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 510.96 t 395.52 510.96 lo 395.52 513.12 lo 94.08 513.12 lo 94.08 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 513.12 t 395.52 513.12 lo 395.52 515.04 lo 94.08 515.04 lo 94.08 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 130.08 497.04 t 130.08 513.12 lo 360.00 513.12 lo 360.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Times-Roman fcd /Times-Roman-ISO8859-1 fdf}if +/Times-Roman-ISO8859-1 ff [13.68 0 0 -13.68 0 0] mf sf +<4b757274205370616e6965722c205a44562c20556e69766572736974e4742054fc62696e67656e> 130.08 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 494.64 lo 411.60 494.64 lo 411.60 494.64 lo eofill st gr +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 496.56 lo 411.60 496.56 lo 411.60 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 496.56 t 571.92 496.56 lo 571.92 498.72 lo 411.60 498.72 lo 411.60 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 498.72 t 571.92 498.72 lo 571.92 500.64 lo 411.60 500.64 lo 411.60 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 500.64 t 571.92 500.64 lo 571.92 502.80 lo 411.60 502.80 lo 411.60 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 502.80 t 571.92 502.80 lo 571.92 504.72 lo 411.60 504.72 lo 411.60 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 504.72 t 571.92 504.72 lo 571.92 506.88 lo 411.60 506.88 lo 411.60 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 506.88 t 571.92 506.88 lo 571.92 509.04 lo 411.60 509.04 lo 411.60 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 509.04 t 571.92 509.04 lo 571.92 510.96 lo 411.60 510.96 lo 411.60 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 510.96 t 571.92 510.96 lo 571.92 513.12 lo 411.60 513.12 lo 411.60 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 513.12 t 571.92 513.12 lo 571.92 515.04 lo 411.60 515.04 lo 411.60 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 456.00 497.04 t 456.00 513.12 lo 528.00 513.12 lo 528.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<31382d30312d31393939> 456.00 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 494.64 lo 585.84 494.64 lo 585.84 494.64 lo eofill st gr +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 496.56 lo 585.84 496.56 lo 585.84 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 496.56 t 740.16 496.56 lo 740.16 498.72 lo 585.84 498.72 lo 585.84 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 498.72 t 740.16 498.72 lo 740.16 500.64 lo 585.84 500.64 lo 585.84 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 500.64 t 740.16 500.64 lo 740.16 502.80 lo 585.84 502.80 lo 585.84 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 502.80 t 740.16 502.80 lo 740.16 504.72 lo 585.84 504.72 lo 585.84 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 504.72 t 740.16 504.72 lo 740.16 506.88 lo 585.84 506.88 lo 585.84 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 506.88 t 740.16 506.88 lo 740.16 509.04 lo 585.84 509.04 lo 585.84 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 509.04 t 740.16 509.04 lo 740.16 510.96 lo 585.84 510.96 lo 585.84 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 510.96 t 740.16 510.96 lo 740.16 513.12 lo 585.84 513.12 lo 585.84 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 513.12 t 740.16 513.12 lo 740.16 515.04 lo 585.84 515.04 lo 585.84 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 659.52 497.04 t 659.52 513.12 lo 666.96 513.12 lo 666.96 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<31> 659.52 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 46.80 t 107.04 80.88 lo 741.84 80.88 lo 741.84 46.80 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica-BoldOblique fcd /Helvetica-BoldOblique-ISO8859-1 fdf}if +/Helvetica-BoldOblique-ISO8859-1 ff [28.08 0 0 -28.08 0 0] mf sf +<20> 420.24 73.92 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 182.64 t 107.04 397.92 lo 741.84 397.92 lo 741.84 182.64 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica fcd /Helvetica-ISO8859-1 fdf}if +/Helvetica-ISO8859-1 ff [28.08 0 0 -28.08 0 0] mf sf +<446174612d44726976656e205765622d582e3530302d47617465776179204f7065726174696f6e> 138.96 209.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 182.64 t 107.04 397.92 lo 741.84 397.92 lo 741.84 182.64 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<2d20476174657761792d537769746368696e6720616e642044796e616d69632052652d436f6e66696775726174696f6e202d> 126.72 253.44 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 182.64 t 107.04 397.92 lo 741.84 397.92 lo 741.84 182.64 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica-Oblique fcd /Helvetica-Oblique-ISO8859-1 fdf}if +/Helvetica-Oblique-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4b757274205370616e6965722c205a656e7472756d2066fc7220446174656e766572617262656974756e672c20556e69766572736974e4742054fc62696e67656e> 156.96 362.88 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 182.64 t 107.04 397.92 lo 741.84 397.92 lo 741.84 182.64 lo +cp clip np +0.000 0.000 1.000 RGB +/Helvetica-Oblique-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<4b7572742e7370616e696572407a64762e756e692d74756562696e67656e2e6465> 313.68 393.60 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 83.04 482.64 t 402.48 482.64 lo 402.48 525.36 lo 83.04 525.36 lo 83.04 482.64 lo 83.04 482.64 lo eofill st gr +gr +%%PageTrailer +rs +%%BoundingBox: 18 18 555 759 +showpage +%%BeginSetup +%%BeginFeature: *PageRegion A4 + a4 +%%EndFeature +%%EndSetup +%%Page: 2 2 +%%BeginPageSetup +/#copies 1 def +sv +90 rotate +1.00 -1.00 sl +18.96 18.00 tl +%%EndPageSetup +%%BoundingBox: (atend) +gs +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.72 537.84 t 66.72 25.20 lo 66.72 25.20 lo 66.72 537.84 lo 66.72 537.84 lo eofill st gr +gs np 66.72 537.84 t 66.72 25.20 lo 68.64 25.20 lo 68.64 537.84 lo 66.72 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.122 0.122 0.122 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 68.64 537.84 t 68.64 25.20 lo 70.80 25.20 lo 70.80 537.84 lo 68.64 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.247 0.247 0.247 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 70.80 537.84 t 70.80 25.20 lo 72.96 25.20 lo 72.96 537.84 lo 70.80 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.373 0.373 0.373 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 72.96 537.84 t 72.96 25.20 lo 75.12 25.20 lo 75.12 537.84 lo 72.96 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.498 0.498 0.498 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 75.12 537.84 t 75.12 25.20 lo 77.28 25.20 lo 77.28 537.84 lo 75.12 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.624 0.624 0.624 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 77.28 537.84 t 77.28 25.20 lo 79.44 25.20 lo 79.44 537.84 lo 77.28 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.749 0.749 0.749 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 79.44 537.84 t 79.44 25.20 lo 81.60 25.20 lo 81.60 537.84 lo 79.44 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 98.88 lo 66.96 98.88 lo 66.96 98.88 lo eofill st gr +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 100.80 lo 66.96 100.80 lo 66.96 98.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.110 0.110 0.110 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 100.80 t 741.60 100.80 lo 741.60 102.72 lo 66.96 102.72 lo 66.96 100.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.220 0.220 0.220 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 102.72 t 741.60 102.72 lo 741.60 104.88 lo 66.96 104.88 lo 66.96 102.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.333 0.333 0.333 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 104.88 t 741.60 104.88 lo 741.60 106.80 lo 66.96 106.80 lo 66.96 104.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.443 0.443 0.443 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 106.80 t 741.60 106.80 lo 741.60 108.72 lo 66.96 108.72 lo 66.96 106.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.553 0.553 0.553 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 108.72 t 741.60 108.72 lo 741.60 110.88 lo 66.96 110.88 lo 66.96 108.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.667 0.667 0.667 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 110.88 t 741.60 110.88 lo 741.60 112.80 lo 66.96 112.80 lo 66.96 110.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.776 0.776 0.776 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 112.80 t 741.60 112.80 lo 741.60 114.96 lo 66.96 114.96 lo 66.96 112.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 494.64 lo 94.08 494.64 lo 94.08 494.64 lo eofill st gr +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 496.56 lo 94.08 496.56 lo 94.08 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 496.56 t 395.52 496.56 lo 395.52 498.72 lo 94.08 498.72 lo 94.08 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 498.72 t 395.52 498.72 lo 395.52 500.64 lo 94.08 500.64 lo 94.08 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 500.64 t 395.52 500.64 lo 395.52 502.80 lo 94.08 502.80 lo 94.08 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 502.80 t 395.52 502.80 lo 395.52 504.72 lo 94.08 504.72 lo 94.08 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 504.72 t 395.52 504.72 lo 395.52 506.88 lo 94.08 506.88 lo 94.08 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 506.88 t 395.52 506.88 lo 395.52 509.04 lo 94.08 509.04 lo 94.08 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 509.04 t 395.52 509.04 lo 395.52 510.96 lo 94.08 510.96 lo 94.08 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 510.96 t 395.52 510.96 lo 395.52 513.12 lo 94.08 513.12 lo 94.08 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 513.12 t 395.52 513.12 lo 395.52 515.04 lo 94.08 515.04 lo 94.08 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 130.08 497.04 t 130.08 513.12 lo 360.00 513.12 lo 360.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Times-Roman fcd /Times-Roman-ISO8859-1 fdf}if +/Times-Roman-ISO8859-1 ff [13.68 0 0 -13.68 0 0] mf sf +<4b757274205370616e6965722c205a44562c20556e69766572736974e4742054fc62696e67656e> 130.08 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 494.64 lo 411.60 494.64 lo 411.60 494.64 lo eofill st gr +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 496.56 lo 411.60 496.56 lo 411.60 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 496.56 t 571.92 496.56 lo 571.92 498.72 lo 411.60 498.72 lo 411.60 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 498.72 t 571.92 498.72 lo 571.92 500.64 lo 411.60 500.64 lo 411.60 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 500.64 t 571.92 500.64 lo 571.92 502.80 lo 411.60 502.80 lo 411.60 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 502.80 t 571.92 502.80 lo 571.92 504.72 lo 411.60 504.72 lo 411.60 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 504.72 t 571.92 504.72 lo 571.92 506.88 lo 411.60 506.88 lo 411.60 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 506.88 t 571.92 506.88 lo 571.92 509.04 lo 411.60 509.04 lo 411.60 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 509.04 t 571.92 509.04 lo 571.92 510.96 lo 411.60 510.96 lo 411.60 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 510.96 t 571.92 510.96 lo 571.92 513.12 lo 411.60 513.12 lo 411.60 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 513.12 t 571.92 513.12 lo 571.92 515.04 lo 411.60 515.04 lo 411.60 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 456.00 497.04 t 456.00 513.12 lo 528.00 513.12 lo 528.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<31382d30312d31393939> 456.00 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 494.64 lo 585.84 494.64 lo 585.84 494.64 lo eofill st gr +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 496.56 lo 585.84 496.56 lo 585.84 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 496.56 t 740.16 496.56 lo 740.16 498.72 lo 585.84 498.72 lo 585.84 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 498.72 t 740.16 498.72 lo 740.16 500.64 lo 585.84 500.64 lo 585.84 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 500.64 t 740.16 500.64 lo 740.16 502.80 lo 585.84 502.80 lo 585.84 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 502.80 t 740.16 502.80 lo 740.16 504.72 lo 585.84 504.72 lo 585.84 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 504.72 t 740.16 504.72 lo 740.16 506.88 lo 585.84 506.88 lo 585.84 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 506.88 t 740.16 506.88 lo 740.16 509.04 lo 585.84 509.04 lo 585.84 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 509.04 t 740.16 509.04 lo 740.16 510.96 lo 585.84 510.96 lo 585.84 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 510.96 t 740.16 510.96 lo 740.16 513.12 lo 585.84 513.12 lo 585.84 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 513.12 t 740.16 513.12 lo 740.16 515.04 lo 585.84 515.04 lo 585.84 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 659.52 497.04 t 659.52 513.12 lo 666.96 513.12 lo 666.96 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<32> 659.52 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 46.80 t 107.04 80.88 lo 741.84 80.88 lo 741.84 46.80 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica-BoldOblique fcd /Helvetica-BoldOblique-ISO8859-1 fdf}if +/Helvetica-BoldOblique-ISO8859-1 ff [28.08 0 0 -28.08 0 0] mf sf +<54574542202d20486967686c6967687473> 298.32 73.92 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 144.00 t 107.04 429.84 lo 741.84 429.84 lo 741.84 144.00 lo +cp clip np +0.000 0.000 0.000 RGB +%%BeginResource: font StarBats +%!PS-AdobeFont-1.0: StarBats 001.000 %%CreationDate: 09.09.98 at 15:50 %%VMusage: 1024 36745 % Generated by Fontographer 4.1 % \(c\) Copyright 1998 Star Division GmbH % ADL: 917 200 0 %%EndComments FontDirectory/StarBats known{/StarBats findfont dup/UniqueID known{dup /UniqueID get 4092170 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 20 dict begin /FontInfo 16 dict dup begin /version (001.000) readonly def /FullName (StarBats) readonly def /FamilyName (StarBats) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -133 def /UnderlineThickness 20 def /Notice (\(c\) Copyright 1998 Star Division GmbH) readonly def /em 1000 def /ascent 917 def /descent 200 def end readonly def /FontName /StarBats def /Encoding 256 array dup 0/.notdef put dup 1/.notdef put dup 2/.notdef put dup 3/glyph140 put dup 4/glyph141 put dup 5/ch5 put dup 6/ch6 put dup 7/.notdef put dup 8/.notdef put dup 9/.notdef put dup 10/.notdef put dup 11/.notdef put dup 12/.notdef put dup 13/.notdef put dup 14/.notdef put dup 15/.notdef put dup 16/.notdef put dup 17/.notdef put dup 18/.notdef put dup 19/.notdef put dup 20/.notdef put dup 21/.notdef put dup 22/.notdef put dup 23/.notdef put dup 24/.notdef put dup 25/.notdef put dup 26/.notdef put dup 27/.notdef put dup 28/.notdef put dup 29/.notdef put dup 30/.notdef put dup 31/.notdef put dup 32/space put dup 33/exclam put dup 34/quotedbl put dup 35/numbersign put dup 36/dollar put dup 37/percent put dup 38/ampersand put dup 39/quotesingle put dup 40/parenleft put dup 41/parenright put dup 42/asterisk put dup 43/plus put dup 44/comma put dup 45/hyphen put dup 46/period put dup 47/slash put dup 48/zero put dup 49/one put dup 50/two put dup 51/three put dup 52/four put dup 53/five put dup 54/six put dup 55/seven put dup 56/eight put dup 57/nine put dup 58/colon put dup 59/semicolon put dup 60/less put dup 61/equal put dup 62/greater put dup 63/question put dup 64/at put dup 65/A put dup 66/B put dup 67/C put dup 68/D put dup 69/E put dup 70/F put dup 71/G put dup 72/H put dup 73/I put dup 74/J put dup 75/K put dup 76/L put dup 77/M put dup 78/N put dup 79/O put dup 80/P put dup 81/Q put dup 82/R put dup 83/S put dup 84/T put dup 85/U put dup 86/V put dup 87/W put dup 88/X put dup 89/Y put dup 90/Z put dup 91/bracketleft put dup 92/backslash put dup 93/bracketright put dup 94/asciicircum put dup 95/underscore put dup 96/grave put dup 97/a put dup 98/b put dup 99/c put dup 100/d put dup 101/e put dup 102/f put dup 103/g put dup 104/h put dup 105/i put dup 106/j put dup 107/k put dup 108/l put dup 109/m put dup 110/n put dup 111/o put dup 112/p put dup 113/q put dup 114/r put dup 115/s put dup 116/t put dup 117/u put dup 118/v put dup 119/w put dup 120/x put dup 121/y put dup 122/z put dup 123/braceleft put dup 124/bar put dup 125/braceright put dup 126/asciitilde put dup 127/.notdef put dup 128/Euro put dup 129/.notdef put dup 130/quotesinglbase put dup 131/florin put dup 132/quotedblbase put dup 133/ellipsis put dup 134/.notdef put dup 135/daggerdbl put dup 136/circumflex put dup 137/perthousand put dup 138/Scaron put dup 139/guilsinglleft put dup 140/OE put dup 141/.notdef put dup 142/.notdef put dup 143/.notdef put dup 144/.notdef put dup 145/quoteleft put dup 146/quoteright put dup 147/quotedblleft put dup 148/quotedblright put dup 149/bullet put dup 150/endash put dup 151/emdash put dup 152/.notdef put dup 153/trademark put dup 154/scaron put dup 155/guilsinglright put dup 156/oe put dup 157/.notdef put dup 158/.notdef put dup 159/.notdef put dup 160/.notdef put dup 161/exclamdown put dup 162/cent put dup 163/sterling put dup 164/currency put dup 165/yen put dup 166/brokenbar put dup 167/section put dup 168/dieresis put dup 169/copyright put dup 170/ordfeminine put dup 171/guillemotleft put dup 172/Tom put dup 173/Pete put dup 174/registered put dup 175/macron put dup 176/degree put dup 177/plusminus put dup 178/twosuperior put dup 179/threesuperior put dup 180/acute put dup 181/mu1 put dup 182/paragraph put dup 183/middot put dup 184/cedilla put dup 185/onesuperior put dup 186/ordmasculine put dup 187/guillemotright put dup 188/onequarter put dup 189/onehalf put dup 190/threequarters put dup 191/questiondown put dup 192/Agrave put dup 193/Aacute put dup 194/Acircumflex put dup 195/Atilde put dup 196/Adieresis put dup 197/Aring put dup 198/AE put dup 199/Ccedilla put dup 200/STARling put dup 201/Idee put dup 202/nbspace put dup 203/Edieresis put dup 204/Igrave put dup 205/Iacute put dup 206/Icircumflex put dup 207/Idieresis put dup 208/Eth put dup 209/Ntilde put dup 210/Ograve put dup 211/Oacute put dup 212/Ocircumflex put dup 213/Otilde put dup 214/Odieresis put dup 215/multiply put dup 216/Oslash put dup 217/Ugrave put dup 218/Uacute put dup 219/Ucircumflex put dup 220/Udieresis put dup 221/Yacute put dup 222/Thorn put dup 223/germandbls put dup 224/agrave put dup 225/aacute put dup 226/acircumflex put dup 227/atilde put dup 228/adieresis put dup 229/aring put dup 230/ae put dup 231/ccedilla put dup 232/egrave put dup 233/eacute put dup 234/ecircumflex put dup 235/edieresis put dup 236/igrave put dup 237/iacute put dup 238/icircumflex put dup 239/idieresis put dup 240/eth put dup 241/ntilde put dup 242/ograve put dup 243/oacute put dup 244/ocircumflex put dup 245/otilde put dup 246/odieresis put dup 247/divide put dup 248/oslash put dup 249/ugrave put dup 250/uacute put dup 251/ucircumflex put dup 252/udieresis put dup 253/yacute put dup 254/thorn put dup 255/uni20AC put readonly def /PaintType 0 def /FontType 1 def /StrokeWidth 0 def /FontMatrix[0.001 0 0 0.001 0 0]readonly def /UniqueID 4092170 def /FontBBox{-12 -210 1083 917}readonly def currentdict end currentfile eexec +d8061d93a824650eefe2785f13cd28a8a226cfb0a1a9915b91e00d2c2cb80ac548a1ab21bed4518a56748942842eff6121b01bc269e7837046266cb27dafd3a4fd0344e68245aa98a5f1b5bc9db554ebffb879f1c082989cf6c044b76f4814df51dcd03f9e3397f3c73d94f85771983bd52fbe6ecbcd9a2cbb7b3636cfb819daa5469925fc89a188732d68c6d06c906d183cb4bd495aed0c41fe6b7333ad90a1674478062c8996476573a0cdad62593c86e4741ecab7b8c75a6bf02971dfdc2c5a2e1c8f74ab1e91315c54e72426da3a62dede611d5967201fe8bfaa5a21c612c0b245fa35c6706b7b9aa3f73ce16604e3109770d367fb30fa663aa8d2b246de733d27174a0b818d54c58c3676435d43949eb9e5e335396296bc3f096fc154616c0b723b0b4a100ed45072f371f77f26e02f1dcc41376638097d79af0a4ddbfc37dd6cb60d0d34ea5a7536c655d95549b8a5a269e7e927c3d89f74b88e17973c2e8d64688089d329abe6b1009c0334d57a6dc34f22efdd933023231fa03fc81093ef255a199448f17d8f67dbc57c38b2fa163b8cef97a6f42e74af55319eb81a6fb9de18810ba9e3659a7144b80aa066a9f386de3030fc4985efffd13c0cab7049a09a71dc1dfa21a1540f4289b13dde08c0d3b4a01fd2bcb4e256b398c94036935bc270713a24c51042bac575ed4827e17e5dc2997753fcee0ecaaca582c85518edc0c3dee2851fa4d2581f7b399f07013ca3d1d4702cc27be134cfa8aa1cbfecac76f1b406b5b3126c3b7b60ec34340aac6433997656b3dcc1af6c8036f051edfc109a493243546721683fe5c0e48790848079c74ea0640c3f9c92cdd22fab8af9b5575a5d1d2cea0f1f715505cb02a1e200cbe4ea5563d0475cb13bda929286f9c11eab10ddd676314996954ae3c94bd14f364d5202e6ddd20b1b4c7abec1c061b2d8a1776577387a2f2dc424f56d44e58b96f91f7b871627089498d76bbc6664e1ebc9b26486cb727d4a5d62fe405324ceb0a5dbf51c9619f2913e4dcea44c5bac49d74bd049f28b83955e13f0fc77d998a307b0bb560757b21e4a982b59cd5723d66952b8a7ad0311ee6874842f454046538c475b86983b4b8d9c00e814009235a058f6d5fca9e8339555518ba2b64ee925cf0944deff5c14069a1ee1de2cadafaa6421f495c21c042690b3a7c9e6a5a137ee005240308e63e0b1d4bead90ec607d19c57ecc24c2ea9b8ed4af8e5ec19575ba230c19156ff9b23915a7b50666ec4b655a2946f97c5013cdfc31825f2c1040fb28bb8876b1accb1fc005010e5e5d061651dc9df17b7bb37c495a37df9659962680951290f3f4168dffb294f83b2a3c423526a97451e2504fc0c819f4d263834ef7c8588ea4d68c98eb5e3ee3c2de20a6da219b3256400a7c745059581d33158a505d5bb07c75bda324c2d8fe34eadb98520c7b82838835e92ddd1d89516478cb1ca795324f802e1f7a5547f671588fc3e5b909f5ab9d573bb0766569a36e89586b7410b76867cad6577022e9be567d1a5578361d83b817fb994758c679fcfd6b22c9fa7c6c76f2a72be566e42167247c831f826d9a10e03874b9747783adece88750be1206a07923cd9fe06b677b61c69a7dd9e0f9dc60771ac529f6adaeee9ee6652cdeca5789c7f242266d86f0154a1984402c720adbc3dc79b6eece6d378555d78873844ba1cf057f385e70474132e0bdfabe169a631e07d12fd21f18736013499081e58d72e9cd451df304a5bf52c1f1723a5ec8b7992d8fa3f33d5be97d4c114fd435a94607f8be09812bc1fa4db028644e2fcef5d86ffb947a14993a93185b054a7cd9ad734c62f2d9ce3c0f9e2e8678bae5b92315f60169aa85d4ae22488cfab72b841374ac3f39966b9e126ad64c0307b54085b6e25d51caef51fecae4c5ddbfb5c29b15cc90ec0795123a84d3c31173b49096d617707d9e192da82493ac9884759115c02ba4686ed464d523aad69167e24e5303ac3eb3da0eebcc420fdc256cc26d466f979c8e637344958f02ba9d3a481693fbf13283d7d276af546abf2f2bb4e6c6f835c97e532bd5b40e8b08eea4441e8a9e03021add36c4fe28180ea466082e4fd7facb03f7abd47c929c4e0d84132835e59f8276ac7fddec7755cba924dd1c97e02691f13f2e159b1e358ef2ba347e2298b0b39f5ffdab57daae22d94ba5064abf716c866b64add8e3981b76a77a3a8be0a462594b9e1257e7940b237875e000c0e23a0841a85da6eb5af931dc0ddfe912285d160f12a66ebc8717fd37c13d20cc132218d31680d596ffbbb2f2805fd931c61693bcbe365f0d19c8fea4ff3eceefe09c5e29b7fde3782b8adf4bb1aa7f89ce01fa59d1322a1ccc4d92705e274bdc287312b23ab830968143efe12c8d4ac45e0c72c11f630eb5ae0c835b7f7d32cf261c20f04b7df8e362cb15cf38c531a3988afc8eb957fcee0364049ccc8d8a6935200970293486bb69db1969a2aeb39829cc4bed803e0c266c77b0dffd349ff9ae8f95558a3977775b1bc2dba5be54800a9e9645155315b062d0b5a0491cf90a66e84b581070f30d5796f71e88db0352432e8df588d25c9c9b2dd12b976618551d5625e357737966d9a15fe3cd9d54bc275b6f5993ecfcfbb373c419e2f8ed32fcd56d30db1345987a445ad259e03053244a1ff80c9343538c74845a907b0480f013289cf475df6c989a81aa5ba904a63db328292553fd4fc3a783fb76ee6ae50be4809ea0aaac9a9ba429c9990eb45affca8587972c54fdd677cd14f81404c77e4358212f44826316a927983c968767e7be1c7a36f308b6cab1648780b4f1a568cbb0ea49f6a6352d6ab18d54d442c176037ad16e18a17d88cd8fda7e86895c89368239f0f75f8c26f850316a328c40efcf316d8829ddb0fb69b250e41b94144e0475acadf63e51f27f6ecb6af4ed78ddce68c055b7a1f78ec1174bf9d67f54838da11655980a909ae1b80a2e6282137c75e49d703e6d5b4be616e62b020a8d08efd14912337a75857920f1d3515ab2771d38d8d8f610c9801d0b0c8d3388c75d211ac4e4c0c491d3b70e1bf1b926a6fabf60487613e76e6f779c4aed60929561ed06c676de7d5052f60db62e446ca4e2775b966f74a2ab55466ecac93c65e48d5e6b88080f24534ca63dd1e6781920be3010f3e9ceb771c5509754ebf963de75b4b9c9116ba7f4e21d9d89d2df167d8c5674b2fa61f49f016b4269e602c6e144de4a382fb7f185dcd82942081d6362f335695587d2ed1071a70bb27d51200a1de03763bec6b2c7a86d8f200505c07f25fc6be9c044110607154cb69efcbfce495dc86dc634e20349712d3754ce99a8b33cc59ce272e39f481b729c878399e51976652b4a525d107ebbd809909ec95f07f2012672601eb9ada5e0b3292d68b6ff8d529a2dcd23f7150d77ba5b1a36701d5954d37ee96501f9efa8e037290f6dca8c024ec0a2ced95b8dcbfea0ddc55dac8ffa55e224d33fdae74502f8f0085fdb5d6d031d34a609db4ed63ceeb285f3697049800bd560e31bfdc6862a49da0ff4b4e84bac9f184e08181c7870058559f826977e851f7dde09163b8b3cc82be8103f7baea3072202ffce888f1bbe37cadb748e2a3b3b53cf38b4336a4eadd0afffd76389b1dd9d067888c4e647b07a7643b81fc08a15872f08f6295eb45e7838021253432f2bdfca6c2a85aa70efea06863d3ebfdc555f41abceb6fc1a5f92448e917ae97706dc04adf0b7bc817c1b93d2f924b118fac5fe6053093401a4676c6d7ce7b4ceae1f5c149b1d8d712d32d56bc8430c210a7124e192e387ed9696df38ac2763e3a065c3ae4726afe9c16b07891bf5243c16add2bf494f9ae8b7566d4ee600a7fcc945d4bdd305daf4df51b1c0222e5594c65af003b51549e0e790ef194943d4accef39419ba173d05788ff822d4e3d4fb5a612fb13292aa377e50a44a6953bb793d0c521c2179012a882b74ece2f79723fb75624ae9c446ba358a3effd738ccb59a856f1bb5afe8635e1033936d58da18ea1f7464758e4647ac03552bcd1be22ef9d4c0f4aea0d7d1c91234ac50d5192bda73b0e63a8303ee284009e6f42c0a8671cbac1c02ac67f096cdb67e83a8d3a8b0e2915fe4e498d50a80892a374cf637cbdc145c2a4a16e0449fd300f7f03b9c80b320addb404d3b7388e5473a6502c74a9d614b21f2526b2e4f9fd9c5adca0f01677b57de5a55d60d9c428c6833d7abb14514926e09bba6b07763aad75d0a934b7c44976be43c289fb238aeff7556183515a5c4b085447922adff5498d29e101a60ff02e893ce8fb8d446874914eb3d3009db46a579d14dfe884d22d9ca5bfde436f4bf334c8c8e73cad66d26b9b711b3a2a3ea84d6864945e529bf59d397ed0acca03a3bb32e470c46cd6639cdae83b4e8e6decd2e8574e1b9361e2600bdccd6c9231ddb2b5981f4148984e0d21d2bc7c54fa7b32144192d32a60bb17520e855b14ea6ba31068d4e209a5add8dd6cec44932063adac2280f985cc70099a1fffb3cdc3134604bb8e50ede70ce9db412a309a21a0541662050f545cf6f2fbb39e9106e83d34dd1a7f9f08b66e68052482a68778687aac8b793ca24cf3d258d7991c4d2c0eb760d1b83dec08277bce87bef9883ff7af63a927a509eb44ffdf2f8f2a529baee6c68478a1f8a10c81fc3fe0a88004843f05d15b34d04149508d7b29ff2b11ad5e150269dd78545f0f57ca1752f6197a8539ab3aef587645b5dda3dbf18060d30c3426f2fff04d9bf22f1591762597d72cd6225f01377293696235f084801440fb9590bf6468e73c11d7de5c7c9899d6a84a9bbe18c8238e117ae4e74ce9c087957935630399f186f4712caa2775ee026f1c9f334bfa2ea897f2cef8f6d2f200bb2fd7d9292c056149cb3091d54be657c5efb690dd7290b7f866330d8b64cdb134019ba3c608bebca348fac2ee3891d54ce18d427de0e8270ca0b19b5cb9ab69ff7bfce6b5c6431fc794f1a2ae04975dfca6d865e38a85d0092b339119f43ee8f11f999ff0132145ef65f2786d9dae9c45dff0ff2195bfc604db64e4da4b681dcb6a3e2be4f691bad02abb6347e7ffb00172df452182679d10029a878d14569825c6df61c229e158f92a6a0e0590722313729ecc3c93a9de9f044e62d3abdf500ea46557e90649aeb8cc582bfb6fa71042b330800d50aebe27e1b7605c3aca1f67c4116d93a1d59d7f9a9d7dacb2c949193b0e901291474ed0f6b746c680b337ccc6adcccddfee2ba9e31f588940931c6d697222b14220ece34f97d640f78eafe33d689d8c5e94ba3eaccb197728d58924f1325c5951246898b2477057915ce4caea524151e7f3cb049441ae88014b89fe7730eed66c4161b2e01d608d977d674edd37527433214b40081ec8a262da3f69f07dd54acc3a8dc5058a927bf7ac5d3ff18e0e526cda9eeacc331cfecac11d2bec5872fdd5cff5f7459a42f263304294b139fd7106149b962873b757a2db3ee8e030a8ea3af3366fa5f3226d9f9de3c48dcc0f701ac74385d2b753e655804a834456e17ee576872bb5e9815bd6ab6a4555ce5fdcfd0b1637357424813dfa6443a46200dbcd46f7a15d342c14e5b99c1e53953283d83e81311eb2537162005d2bc0f18b336e33f7190d4cc4ab8a86f596ac2522b6fe3aec0befaf024e35f811a309c8a03734e432ac4695d977d6fc14c93773edfe0eab4b5a0a6d55b4ccd205086b92107a434b119d15f145d0f3511f823e69a4b3777b659555f06116cd99075982c200e36eff85d7931c7b918af5504bb4129cf65c8a33964b3b6fd3b2340fd3737c73f7667632cbf81535b88096e99a5e98ffee00409948eb2b46010a275ffdf345bc0e359ae4c2b6b804a36ec5018db1ddfd43ed28e0982be3dd61a41fc78221bfaf4eea3c94e8819e2d296a355bf61cc29ad69e2baa9caa77f4587be6bccfb178d553bb99bdf52716e6a8e2626505b819cc595f5173d13340fde8dbb4db3313a66348c8cf5fddfe7d7fd04becc8fec0ee1385ce5329088e772f1939fd59e2dce71c2946044fdcd131e06695ebfe5ae6e512640d0ea79492c20880391bffb1b3c9851cfba1b5b16d5860baa2a2b1f4e0a571aa3551cd73256e171c2590687e3596108defc56ca6cefb27095380b0bfff828d897c5f4a1f7710cc1fbe37ce9254c27edb772093e789a7e2a941d676fa8f14edf641dcb06fbd638e74a3764be77ccb7f93b5f961be59a6df0c5305b6ab3a20ead2d3eadd749fff40762a25833c9efbe377d2aae40b18e7785a77f9eb4f05f987ac7572854859f5fc5f56240e94305543baf5df3fb905a1122d20d09d7133923783f4d1e30ce9bc990e1d4989280cdcae75b5a78ff48ec68254373f9a57663255c0d5a18bc78b3cf2002befdf0cbb3cb5e76243b963e16ef7a34a06016dbd728117ed141ce213dae5acc96930ef9320938084dec3f77ee4e595b496648896de03deef6fcf49f6477a04a0b190fa668ecb8dec555db55d7ba7d0151042dd4f205e50f53ca706d93c9ae1b67b51989ad1b3ebb27f2416588397429d2129bfe0d5fbc7888fe0ca49754024224ba6fbd089214122d5c5dfacf7fe314c34581b80fe2f0786f7a70788a1dc27bce9f69daf04f197e9fe3f735a339f6f88067636e23559d1a02cd1d8b70fb07146532a5b404a4491d8650a22ed0f49088e86054e76656f079074ae121f5039c5a128109551c3ad7bfb874de16f639a82f0cae1ba1e26cb21bb8ab0ffd0fdda61da950d00e9a9d319c32757cceb80c07716cecf71f96dc167d760bcb54c8c41387d7fb8b5f884a0f7f53acced99690e1316a8f2005edcce538b3b511a637736a08c932fe9f54e281535c9ebe5716228cef9648813df7f0ce70b5107833eb4025e11f93aa574ca8215ce3dc6a5069f03f22a2224d9d2f8c819714b3b02f32066785f9aaf616afa69a3c031f1d1ece51d541f60d6b8e739b63b0f6472b93e5e34cbca3474b47deec1d72ddf91baaafa42078c177469e8099ef4a80758225c7839a0ba643dc3c88fb01ca0f278f077675f0f3bf3319931f129dbd9ef04dd0daa8cf8bc6573b6b2091b64326a366df67a739f27f8c20f47ea3bea9a9880b0aa3b558c56f6596b0f51b124b78b717336142cc03823f2d75c0ad84c09868cbd0dcfae4ccf37b345a26d5e08b20c36505447042ee2ce81f450a835d7e0b679c0c9eae37ef6982001a8c52708c5db0ec2294a90b9876eb789ab09af859a0a879cc27d2f52dde9e9a6960fca2530244cc26d3a21cb294458d707dbe2441460d79d1783fb334a3d144339bdd635b676a1b260f5969bf089d59a526f56bdcf92bbb2d52cb268ccca6c66e4ceefa57c72cbdf8a4e1a2b57ff356f8fa49db680fdbaa3d4df9f1d6201307a44a9ebef9ab8c893518d71beceba645d6df155f6aa68163f8d66b40c1084b673ac16b287f763d40db303c4c9f9e76a3e8fff77d595e97f7e59e56b02aa8f005d0c6830931892207e25a11520efbce320b99362de47e093fdd48318cef9458ab6b4093d1480ab1424e82695527412d0c5e3c299eac02b67ee503a9d04d31431d172f50666fa59e778dc43ffb7eb3f78324a5cd88601f7109bf3bc03f0256ec90473715c9a626a8488a4ac0403438c7fb97438334506f3718c262c6fb671cc1501e1616281c50c1f1abb0e796b5a989d9419e9146784619689562ee006255b58c5030d4deb7bd4e723d5dddced22c58905adb6a1b319ff10a8610912023c965c87e8b9f50babf746950ca2b356c1a9cc1cb8180a3536b2a639a147f65a8178fbe711c5fffb8fba62069c74e02ee7bb219bde7f581ed080e33ada55e37013823fbe5eaf8f7b774209a75b047e7626b8b82733f525e57792ca6c79bd882c5bfa323fc5ed98227c892ff958a359fcf654cb8facb6827d717a899ab9b4d2093e7a3762ba0c9f7ad55124173a5bb29f9f8769484f698dc8f8b394816dd74eff3b1a7dbdf16096bd0ad1b5bd409d56783b6d418631be43d241d6b834e1e8107bd9e296f9aa43e90ef753d6ad527875f230f6b1d3914692840fd51e8048ef5ecc8e7d2da90645c8e0acbdb3803d677cb07714a5fbaf0caa48234e6abfd0cc1be8a80ea7e956ec40a54ce712c979d9d108c28566d3c71c93c25fd7c202c637aa06f1baa00ed6262f87062cbc03e7722983a7c87645ad8d6e0df84112139cd220b03e3b874dea9b9705efa254db06927ab7951eb72ea84b253e0bb877b77fb1810b078ba9f20280d7e85fd9d134ee7166cb1cd51525a5bde7cf96b26569af11b40dbf5b4b25a662c9e14dc084cc349bf451cc976d1de3ef735d001c18d7e6027fdba88d29016ba395ab7f6b1d232151acca1ee234a287c2d7843223db3df6e3e5325a9fc82d92b0baa4a28fc927a3c3d307f7a7ca1ec7a54e8b4a56c177aedb633425bc7676a10c0c2d51b5555f4757c2c9908cf39eee8f85913216c5df40fc6a04dc460e99f55844700b4e02ef7a81ddf4bfa798e5ea327d2c66db67c608afb6ea5753ade25c620d52a5ff2c1d43385737d41e7e6cc645b1f9dffacdc0e8cf72a9128abd66cfe77f2c273e7efb2c6d3ddf4848a023911b7287797cb7a3baff8df5f4d8baf2d30d8ef3daa330fe4728f2fc405bf82b6360d1c9f78d17fe13bad721756ec2bba578702ab8a41c094b22a2ea393e9d4d597e5d0c2f12ab5f21d4546ac61e0b96ad5bc47586bd42edd8caf964cd2b997e0bd816ffd593d5481a8ab543384f8090d7cc0d9d4dba9001992366bbd61949f2b33bb6633f45554e879ec6399f11a13be5d195c927f9e4fb503c2f7f1af69725add00166a3c6f0b72230416d09687ac6109eb06d16b8321ab293cc112cccae7bd8233a6206b814694eb0057b708a76f7c793115dbd09b6b6808cddd0dccbc2a20c5abd02a91f0846ac0856a5cf7be1319057e48631937a3bfff2d24f0fecb55e929c1c7d8dfddf2fb892926e20c9fe4a84bc1d9dfd203d438a7f989ba23836bd55b1089bcaadbbbf19e8cf001f75059a1dc3daace5ef08b0b55231f3b63ccbcb50805601c86e10e48f90dbae123b55d421df8301a9c67f4cdead045d1ace302b93f9337ada9ed3ea36369cf35577e868383d69cd425ece04e0cdc1940b296c35e1314d837d6fa900d661eed125ada136ae005179a03494e23a245d96e60cbd7a04f9503c227e835e58935e28bdba5446128f0db08dcd9b85049c5c67e357a3a511f37a71df23c25f971df40b9982b1b5ab845bd4870fbcdf4ea319afa2e225dcbe3b4b06b73429467ab402aeb48e3b661a0355cdeefdb754d43b66d1b576a1ec93994587b16fef1d493d53263ba10fae3dd01736b479e33dcf87dd9af58b353bc55b8a5382aff065773ca8e932d8e55a80537dc04193176a1c38082e3d4fbc38ffbac68bfcbd80ea1682b79961ca070d3f7938571303267b2be5afc70f196383a01fabd8952db19f7c5921fd66ef6f44523adb1bb09ed0cd03c14b8fa91b088ecc5152d6e288f2f388b5870733b489081581fcdc2e1483d3a2dd9b1bfabe1732b2ae37041d49727a2bde007820f328cc2118b610793e6a6996e1f336a061eef6b61120049fd0b9f0847409cb3a8ab404c563c1769de2660b073dcb30bb916f3679b5819958ce2f5330634e2361cff5c0915861ec791b0dedf34a845103f7e1041a366e6109b88bcdfea2e0d0d260f16717d67e20c9a0b624f15f1f05339a408dbc7fa3b8395895bf50691bbeaccbfe69bc22e136a37fb9d074d668eaaa2f98af8ee35119d46af0dd9939462cfd2ddeb85792ca7d38d61e2c5109d2c91fc8232503900396ae6a85b7a88c80136699e77c0d7408eb88538cc544a3db250e2bcccbfa8076d70b026d46cefa250c128f8ab95d1ed9f028d56b01489d81da013201747b80513f318b84fca9dd1c4d65f36a82d09d847d550e1854341338456714e0a93424e6146e34994f84cc6bee325ae41d716920dcc0bfec62368546c901a8d43bf94c9bd2cb56283888ca54b758135fbff776c9fa98d50271b172889414b7e948180c03700d2cf3ebf390f0f9c8985900a76be9171f7439c60e18a0db5a46983722ff1489f77d24f2112b9035e65cfd10fe4c560426e464b6759ae5f24116d16f9a3167eadd85389114535f44f8054d463c1b8bab08779d40b74ee854aa6d652aaf40c30d63622eda14aacdbc002c0891abcc764b676a3b049deaf49d6789c7f9cb12bb6f0d1619548bc12b6df69c98a4af5b085c76966b116d6a2cffe4a00733efe59a473985d5602319fab0f04dc3a55be53e9c87726d6ace09dd8343e3e111858a3ae45b35de08b1730fc628265f0afcd3924b9c143450128aaf68f41fd5bd4aedfaa9411bd33032a81405dc45005c62b682112ce0952e1926a47571a8790d639580797e33f991aa9c0b7178448591f044dc794e31acd413e6ec84b3ec0ac0df66e08e9a89727f91620f3f18f9238ada2abf4557d72553f01bebdf62bdf5742d25b47def93114918c643aa2bf8761441ba5e6699760f9370b5c29545606f6003e4c6e4725dbe4078b416022b20c1d2aa30d0dcbb724783777fcae6d2487bb793e9435218f93573064f47408d08a9c39bc44caa91c24177e8283e59cb9be2c46c5329b150478beed8c6e1e35bf56c3becbcadaef963bbc70128a1518c635420921fb37e2252910e270692e8bd641832740d67f2174ff3171ac73c23512bb0682a305899af28fce475f399ffcb310dd96cd469fbbb7629fbceccfc497fc2e469a14943fbd5c4d24c8c89b66f6638daa38cbf9dcb49dcf016d768acdf758356834503afa00b7f5c8116e147c5397c2aa8ec8a241bb2a5dcfd45627821a79dee1ad9b162796b53c59e3938c94a2a531b737b7d108b9f1f42a2164027e7d3922858aa7931dc0f7e0ec8e0fc30c27d4722a4d083115c916da5976680da42e3a7fdbcb8084abde4d1f95f62a2291847c4358cfe83b13b9ec2f1378f75f787b2b573a027b24e9eb8a47188be809666df8772e43672f910eeb1c23355987358a1bf34c3a88c2647a46eb85c1429e2e5123acfce3504e0ccf4b89e9b3de548e2bc16b8e765bb53568070a17b23aee93b0988b67e10dca6129f19083a22e950a6beaffbf958a232d2b40a7966f96d8d6c1d30d4e9d42ee28dbcf0bfde533a8b5c07c32c90c634bbb90471c53658d596fd066db06cf96e76f5563b2dbf17c284fb88a7e389b9340cb17c0707caee7791234d4b9cdc0406a59ad5aa3ebe06c7ac21851139171b188bbe7b43422e3847e30014dc2f4966126c2d23e1d54d0db34fb2f415347f14ccdb4f533d2f4ccfeae45f21b027cda966933daa5732464d7e125f32b05447fe1d15170654b53a5fc3ee1d2d8427096d1f71f2bfa3e240740c879ab752f0b14d1d17fd880f05d65ff64a05bc08f69d97fb63dd78346b9ca038d79764cabd013d57fb3506d4b0ccef1c92bbd704aaba9cb912e6034ec9ab77210531c9a1266c272ce3261dde19b9a574fe5a7a031416011100ef594396adaed9f884d18173f0fbf256e47d5c57a47864a3d592c2324c39bb6b9f8cd770e23e5884fbfc119eace855f4f21356a57f912c9e27fcd292534cf2ce0e0490aca08b4df6a3faa614239252279fd2c3df91e054129e1ba23fd9b7a90ed0cbc1f9f8790ebb11bec7b0b07a228054e1f8bb4241ab3a66bb6a224bafa455ebf835e5cc1b0f7701e2e64190091a577dd835afc77e72f3970721e1b6fd64ed65abe1b7376eb58e3273254b2da264df7a97286ac43f1c55f1b50710f54cf02da4023260084aa143dff539c5c7d5951767d0ca6b48d5ae8dcfd1727774ad1c5e7273c2aa5076c0a0fa3ff8f1bdd088fbfc17040808f3bbaa83a228b573694aa171d4fcdf13185e0a010788698eba537240a9ee729d7af975b4a8637901fa3aa401cee44a0940b4378ec67b101784d07fea844a50c542fe2a3e01bda791c2ba0ea9879bb298b7883e1b8ee13a88f9dd3b28813baed3f97c29bc8b9b2a0bdfd03df29f826498abe20f8bb7ef6be2930377c56430b7b0ffafa4193998c32fb12ab1ff63695a3201e227698fa8fcdb065c9c3a82d2f0b8a78ddc9afd5a1c5b135b019c22a46d8401559149293420d91aa98397741e9cf6bd30134bd8b5f3c5a1889e5cdb61aeb0f8a052417c5dcc3eda52fd90b2a8c2ade1a0cba31ccc88a78e1573f68ec6104fab6c417c631e90bb9ee10daba4cc047ce30b2eb735ec694521b7a87edf3e15fbacc941269090845894eacc56321d38ebd3bf3bdcffe80e3b21e4683736c81a61ced165e3a2fa10b969ddfa1f55d340612e7550144aa43868d2ce06491f2e5e089b1fb3880c17b6040343b795832e1638791ab2d12b1df0ae253aa1b3e9fe01bb06f7f306c7468bdb397cf4a9977caeb0a3c95adcceb5161f95c985b08d5d703bdd011d2d4a38f16795b54058fa2183ce076cff0762b3ebf56d8d8d0fafdd508449a2f5b0a8692eabfa509dcd0b38f09f4f99e56a0044c61c067a107857dac52e1a364ea053dcb290a7cc1c78420bf502fcd56c804c8729871aae4a4752eda8c1f78de3419afae90eccdc7572a00deb5e1a90d1b8676ac638f011b18cf42c99264d350b77a64a09c433a470f3a2ea988348f59abaa12a1384b0558890e955f1f385c05c740a0b44bb51e9cddd91bdc46c8804eca94cbf9e0fb0c18b770b70f81fe5c9c6554b3a781b22665de565d08fe0b3bf6a57943888d387c19c296827e60eb6b81685016bd1b1c8d95b29eb8c335fd76b208dbd5054b22e1fc0ab4743f7b95d623ca64c9f9afd5285978bc5635a54a70aa16e736372ed027e9518a4d0d0f9951996b210830e6d46ce43272dd0923483f986349321b2184555b6a6573bced5fc778d682085d1970f05cdbe85c936a4634c9821776b4ca2e8dbadf3715228a73c71aaa271ad02bdd76a00aca5bbd2036ef7bf949814e76561a22c2f2ebcc43c7f4af62f5a40e2df2ba612e77adaf6715e1c980aec44b1164ea20020dcb5d9fb7072052e733a0a5b69d175ba8cf48b780b371575e490571e05b3fbff92f1e0fb87abfb18f4f81c8838d5bb155942adcf8911fc3926a22d60bc9037d8eb026ea975c00937d79432be5e791ff1265b396443813020ad11f0e0ee66bcc4d68aca9ebc2b4b8aff28de824007d9d9d00a12ee894e55c565f957f5f0cff21e1219c0badbc99de37c17efaabbbdfa903ca892d5a99a7201813a2ca9cbf7b5d19d779c82af7a1be51cce30ff3820448d2e10b39154573358bb6376ce5413267f6de7d7cfcb8d4d9aeed7a0f6648834b1452c58f397ea28dba8cadd4ef29382d757b78649c6436aa3e38505e1543fad8d22a415f8c0b6afa7bf16cbe0aa85eb9042f0757c8f3ce4e0d432b2b0a328ab69529c5f8bf8da11b0b354858df07e4644aeda913eaec05fdc24b95f6f4307741897662f347ff5785bcb06c0aca0ea708cfee767f385962de34b05f897242256c1eaf5fd9382fa9f07c3b2acc2d0193cc7688fa71448b4374cc3805cec6e7b503a693be2438fb03037d7a70088dc9fe10ac37c84d29c8b5f04648bc23c998872af1df21a88cee43d52ab580248f6d11c0896d25c4ec8068afc138518f52a23c9c8ae8dfba103cc49368a2ba7a6111a8d0e154d007cecd32d9a71c3341ee238d7664d39a263ce2d5efefe4065c1654c4996e5eb10397d78ab6ad8155ab5c815707655d2a85a00187f8ed16ca19f0fbc8c116417420666e9edabb192cb81fc6e2a4fdf00bcbe0ab582a63de69af3d7e7c6ec7f23c09f02a81a221ca2d2edaa751bfd3949ecc3e81d6f518453b47911b0aa13ff53dd8a4af4b6d8f40cf4ed2f5c3e700749aa3211aab791b9e9e899b4e53f3cf1d1c62bbdc06ae2ac394be1a9694858919da321123184a8a07d01e084655b974e8ae6919709ffcc4826f62b6a5dd420b784eb881ae6e682b292d2e575a28eec33e21afe2fe17e024829ed46bb4babce2e65d97a656feae5f5bcd3f10312a5a102bac3e502a468c382349d47b6e7fc4435a8c56d61ca2c33d93ded9f2165c1f640cd23b0f36e64adfd4c5afcba0fe8cab87ba2040efc0c2f00d3fbab933303b1c34f15a60158e5ebf5c82ed18c84c54babe8e1e4910921d3cf829cad909acef813f174ea65802614fb567944b14630d1e4b063c49637e7110a2ca6de4f34935866b3ff0c3643014aba7f8ce5b2701abc1e0f9caa048e7d8fb937bff1c0319a1de8f126a16740d7f0a8833b60b56864f98ea428e2f105ceff6dd30a16bd24da9f75dea0f4ce864bd44bc52b73057527b73f35a7f9e7bfdde6435e68fdd781e82b69b22c09b139b35b5a47a385ecf05cbf2152cb5c686616f81585bafa01d067a5a086cee61113870dfa9bda1b2eb1975403b994e4669b30bd5354784b1c5126ea7313e3230fbab806e8cc7411149ac52029430ce0be92453dd7cb39026ef26451d2f230392670bdc181a0d0b24267d08861c5e5e0d00d85b84a0873c02f678f2522eb8bdb04c2624256e79396404f475be988e4ccdca00ff9c4aa86cc48ac5f05d2ff1ae536c5f576d719862d44049edeb7d25c2e78e328bff60bc1f09db639c10486d65a8da9638080ab92b3c9af7799a8149cc771857f3d36a495fd7e58236beccd8ecb68aa4fdd1f8b3fc21796e7327e0eb730e0cf78567e40a8c0842dc3a9f7451f347af2375ef47b560bf6f9cdc8e682ae9574b9d7c9cb4c764ee84a22303a35b49568d8dc89f74c0447b0f263ec71e4acc6de6e6116085b7edbb61ca4b198e2af4dba714c3fe6b9c821ca1880eb1b896b01d086e80a43ddc9619789c75ca44f8dc9d4013ed4d10c50976201e6f020d6993d42fc902b299000581b04d1db1a4c548a774fff638bccb298f45bd0a30ac11a107e6b9042c41634732855c7431610456d2d163129166cf90feb8df5a72ad9ca31a8613ca3df539f599996904716878028bd884b1a8d75fd0d3fcc6dd8e007f6f9761ba55a00fa6799b6a3ea67a6a55ff8843cfda811582ef1b553b27c05331aae09b5a46aab96566568153afaebb7b4ae5e71f7cfa6fe08aaa52aea18d1551068e25942f623c4b8e8a56f46e352cafe4885dcb1eb19c458580d2049ffd77af8380ff452acf5ab88fd52d7ef112c29ff6464e62465398fafd06ef81bd3fc2b4feecc6f45f0146c96d4a7c0f90e861a1d433c5deac14a019f50511d6ae9f363952c0ba815bbb3774c97c16038e82e39b76bd15f58f6c693a973d1cfcfdfd65ff61efd3d6ded93c3aef8a715097e97d24ddc94ba972fdd68c732e1a9001f3fcc1a71f1f9fcc1b98637899fdb949c281d858130712d5d5408f0208d62f5cd7f81dda2649edca15790c87cd4e24ba48a7ae328822f5a21e57f6fc5a6fcc71d532ca6817f6eea89f76b60e4fc7bd243c2d2163b46ec46ae4be40764f95d1a51efe6f6d8274b668c50cf1de75ca2b4791dbca7c9232d147d568cfeba0b44caf8154bd09fe8a55a8bf1bb1afa95226a827167b13f33b924ca637182b0bac8b56e03327986568016841bd25cfc769000a7c746b2d930d291ea94f371563b92535003c4bec0bea1b134915286a1665b643bd011015ef04ac9d5abd487c0c4d3c6b20a00646b476e518fc0b008960148a123365cb40be362b3b1694a8d5c05d23b018370f616496a52c2cd25021c3795baf897f812f62a5a5721ac8170e79b49cdf906bf71c83af3c445a82a9b0979506e7df0fff03405f717f51c69c995d11456b03cd8bf9395d33fbb127e4cf9d8fc8411a26d42617ff2d64e886ba9fe5c7d5b85b43fc4faf88e7b4eba7145234769d58d53a5c07d1468693b0f93bac6e2cf5a931b11506f556484824d227e448c0a3805f2217f136c1a7d56f3421588e286adec32d32422b95ce8fd81eda1c3e9beed20f03cbe487fdf2d65f59add2bce47cb5f225b2c6c09100225b4276d3cb5b6792be4b8f0489bb750f1188f371880930d79cca6b09b2e3f303f766081097bfbc5e538d3cd4ebf27befc9132225dd7428d444c764860a262e95221f0f1fe57f5ef3e4432d2be9b3c9954a88e58cb329ce9cd37f4fc8494ad1cef800a7bba8d2ce486f7ebd7a5bc9dc73458bda9e4c46c6297469cb8d4e3877ea8db014c04ebd313c6b1ab74abb69b03334d562422a6529b8e68f4262dd3ff05acf1c6d0074d35e4e977c665a26f86d6bae2c4d64114ecfb334c4d575adab7905729ecc6345e3726d7f2c361ab9d75de26315cfeeafcba9bff88c0ce812554b1c6ab0c5765c5618f1bd8dcde547b86af905406ea216e4eb454e59a835fd9648dc5c8c9da88d7a753a2516b50d93e7226868bd0c4c6c2eafa7a0696a8ac2f0f3e6958efc1e6504032b42962ba6eb3c5bf856cbc6bb090d481489c42a8e6d5721b6cc02b34d6650157752126de0cac4c31b7b073e2d6d546476682be55d764f5bb3154d70dfa9244a6fe5580db958e4a766f95a61987102d67707838b177d10d116ad56368c48e815b30fef5fd6554acfc0d9e64d3c4f6b8e9b8ef6af2e09c6126a92f0865045cf97c94070d2fa013be48df5e50bbadd9062fb6183b147f7dede8b571826f81d546abddf5de4f95a97bb75200ef5dec4abef4950b587763db4fcd61017a457c00230cb8aec3bd775980ba70362b6e8d064f81062eabc6149c115feca46efab3b703e76a9241c72f6b6810adda98e1baf07d6a7d8189f6ec869b54941c40080a91980fb827c61c1f7399539387fbec2d1d46a54b1f518859b3a385ca098b86039bba25d2e49b7968281e3e1c3e5c48f2012680d81ccedf131a8c8891b4134bdcfc70854fc7787d03671c9e55185793ff6926ae12f1dfe8cf246fcd33d88d159842e8dfc7c257836c98752b7152039eecefadd80ff76e816146635ed2d36fbcce101eee7daf1515676b9a2b203e1cfc8859d128852e25f9cf924c16d4a47272e495645a6dfde91cfeb39f4e6a1613a901e2bab7c975c885f6424b617475aceb396d0d3da14c102a69987f66f38599c60210dcebeddd8bbc80aefadb225df56b7f48d1ab0a8c92584a41b9fa726a7de8620cd32472c1b89ee1cd0e3da8b595f98672343417f766bd8d9c52f3cc1a9bd6e1c8c1e588c023ac6e5355e68aec6bcc303577faa7bff293265f9506c6107432145deedef7b254d5890c755a39f5b3aee4364373a931e98d5ec011d247fa9ef17a68b2df72810929a628f6ae634f4427c1538dd02e1c9962f33273cb6add06c81d6258de794f09700a9c8b2b6c3a30eeb00ece206d70dca75beff10e9619d80bf0a7d93f24cc82b33640aa992945eac34fff30584801e2ca0fde10854ec1c60cc5c4bf08753009063e7efe7e07a94cce2de1d2add68f2abf5e6fedeb161beb5cbac9ad02c043d3d157acf018751e1140776a7f32d71f34c05cbcdc9c08a7c7a03f596dd7164540566fc54fc1fdc2b23b14f002eff9066b55e30040ff5ac54b8fb6d9d643f939aca40e5005f1d5972feafcaa34f2a72d6ee03ed74fa5e70faa11ad4e8ad2d0f788900aba49c29090a73b3432d9ab5d933c115abe4718cc9e2a2d770e9cdc735ad5991455ee0496b0ef2465e39267af0e36c30da7f3ace53cf3f6010679001e39f6e2a55da65870e9793b447b418ea1e519dca3c2bf0e1d0b0b07ad96a0708f428173694f70a113c0a0f79b3251914d7f8af58d59d6e198bdd6155cc3a4468be06e0af9a1c94c488c9fc6b44e759e43695c0873c1415fbf56c065a3ed585a790bf38784ff3cd7baf3f4b22533d735684bbde582438d213bae7dffaf897289cd0052d6788718be4e3b7c071d3c6c7b75f6e0ff3437e48217e179e35db0f088e80c8aea5749c71fec4985d00647877c9db4a55b51f07198c232adae969c821be6ee6c2b1ebdadb00a8916b1f93b1724775ba9efb421df723d54cf22caeeaa1b6cc7567a4279647a6e099cfe285cb30cea5a1019f43cca22765a15759f20dd681057a0832833c15c54cb1e3f0196aff51abc2b0ccdf37edab8b536c2a4bb072293224e9d4e83ed427b8ab2b92f52a3fa6bc28269618922a022f67f778779bbd3d164aed6747c9639f1628a6643f47dee03112facf7431bfa1954ab2d58c7b02ee380b86bec76fb52093fa5419c17f20b123ef0b0b5c0efded93f18e2c0aef25c1665c3f91a3f7faf4dae9cbd84efd9ec0a5ac4521051118c1e28dc3282be83918c9b23e06363782ad6d6e99f69a016153f70845309cb9d8e85d0ef65aabb02b0648665ae39d5ca7ae9c4de2cb940ad8e9b5e0e59ebf2298c6e16fe35886fbbeecc719f000d9c9764f3f90f66c8f9a243bb25bf84ff7cafb76be8418da346319798866bda42213d5acf00d836b2a0487b7fef2fed4cddf10633bc7f2fc2c0e7e7c8785b9bc1eee0d2d5ba42fafd5360f9c84c1a9fcf8a76ad2916c31d66257c39a760621cd0ae7b4189e051036acd5aaded0acf934fef24fe71a14cadf03afd4b7c1752e0c2890930d3f74b2674bd6135555911face869062ba346fb8bfc45d09f224e69273d4d00d5451ba213c798811eac1b8fdbe4631313aa8e35ab728a1bb9db3c806c46db222980828ecc596b8a081368d73f184401ade2b7f6debae497ef70b13d2aba139f22f233b4299ebec79ec32f868786c60171f0633ba142938699a702eb57a26d9d6b2e955a90f1020e798b3903e9d9dd8f8c98888081174469697170c38d5737a58c8258c8a9361d270357e51b67011ebd39578f6963f18bd050d014b592dc375e006cd02405623bb724b1dade6b3cc632db58ea103ca4a3d939dee5df3307dcbbb3e3d0079fe70c6acfa53430f31075b1ce444454ab8208bc4dd2b71d3d8dec8bc4d49797d2bb3f6b35338e9f1100b6c079f327a639e33cc262fad9b18fb3746829af4c08ad4a84baf08f6cd31070997c6d4b78fce290807a05914db726d20735e0e7058f73856aba4dc8642c0fd52314e856f32e5d0dc7edb7fcf7c5d04e2fea3af94ebff28fa8e886d756049f0e8a4c2d22c94866366ab8b0350e1bab7094ed1337ce3002463e49fc894ccbfd05f133ab0500da55ee616f23b36a748c528ee8e2b792eaf869e606de86d3eb0a7822b7bcef21c010695c05adf371a88b0b36981910ce1317560bf020004077dba0bb55f26249beaa36e7da60d783cf89345b38e3c1b5928b9dcb5a677ec98cd4acdcf960d3ffd40e86c6fa43ffc198c2bb1ba99fc5fed92714591730fbc7a64ab5ef06e18b5f18bd37fa9c3d954239d6dcbba27c3081eb7944d53428bdfa189a83db26d864dfb4bd729a2ea41ec866b8814d8a0664f0dbfaad60dd54ec7c61358ebc416a6bf798fc65c408e48c785e9a0746548fa593858cdd067ae1e0b5a35e49a338dffb1aaba512f5fda377b8f3f4aa6c76f2d33a6d4fa73169a9a2cddbe44b49075efccb37acd99774e63769ae150647f354f0b4b93ff3028c66de35f1d715146cf5d5c1a854b45bb38a5fa45aa211f988b4c9daf94f61ceafbd989d168439c63b388672d2b0bf170b037e5c38e89df56f80d7c6645d7c045f4118fc79b7c667e0072500d627eac7bd3a17614934e238c2f575f4a978fd53246da9d3df02a28b9291cc09a71361b010d1605e86f4f58298cec9be2f7e17aedcecd5d87d7302b2290f1313eff056b100ff9890dd989f495182e2532c691d96aa97dbb2ce6481a0f76b4e26fcd97a02996c39347f90aadad5c4a65e62f9ba6f37fea8df342d5c6cdda448bbe7dfc4a461fa8cbe1c2dc0a78abcaa67129b998e6f9a913a6e7c84e36b936f4db32f000d06bcfe8ae2d5fac04cf45bf3fd3f117bb0b3da685e109a82f200a1e0d7f8522332e5524a3fbc6e864a86f9fbe30558b3263847d890afc1b64e835e1526ebf69d743a13717163fad0f9e058816a176051dac15dd0b7e2f0ece4d367abdb72a339898575595bad4acc3b46b597db68a5b6141f850d243fbe0b3cc113bf7eb27fe4359ddfc4ff3ef16bc7acaa0f3524f310679c03333d3fcaaf2e7507ba98f8dd1b770f36e426250b1ff8a9d4bc25c463ba8a7630a582aea3252e0ec28d656063d6177f74b1c88d457bf9059895e570cecdd6fa724d2015eca9c76ddae2798f82a181582723d0bd2fe875792e22bbd67b111812ef40703d6186261d6be2747c72746960fab45840f4ff6907949f20902b065fdee98d2c13ba04152bbc70eb415b14e172b028771339fb0ca708bf580bd2fb6a6d6efc0990ba5d213fa95f2efdd8b1c1b699841b8e154451c5de23871b54be129af8e3043ec5780cc395f325d33c4d932a30171ad6c362281b895db4b604d1d097b8f4162bca2f6da265e7a2d1130043a9d21c95effcca1ef06d47c6bbb7860392e5b77d17706b5accad18e8bd19ee8ab2e950a5d8f6789119a4dcb02ce64ad5fd29879e948be85c8c35669a06b2fef4fc27ad44a3a5cffff063f9268ba3b8c54a777bb750eac7e3f3ee767a4eeacb1b7019d3eac82fe5f943bd042063df081da663ad14e7f4661e550e495f413002a6d3eab63e159baaeb60fb7766baabab0d22b82221bc37ed6ca672ad60102c15d040e6085a1f4fe67bcf63da0a15205892a04dad9b3ea918adf24d6479fd16e935badebd0aeae1cb6d505ffc29abfff2708db39d1ff6420288b3b779d291e3ac4b944512eca4f63f4e1069281a089d91d3363d15975ffdd1b103e4e2c163bbeb915a5d08454857a9d29d24b72a7e7df6e3a7e90ed517abc95a448aa0179959285247f17cc8d0532fb13738a6a21738ebec71e2e68c55d8a8b77d456b385408650e627970ef13765744f4a72e4990912186a403f71bf2a9b8ac7211a0499266466c65de65157d36302cde084d348ba46da3efc430677bb5b34f75f39f16bc710dbe9c4a4869cc6e820ffc59239b1049720bc24f5e59395f0f0f153bdbf207df37311e0d85db2906f70645c876c000583812026239a535cc06a4a6c2201b19560bf574825662aaea2dfcfb3551752e89459e4082e9196dfbe1251fdb94b9f997689be8e8609d4d78fade40844bbad5caff8a07376bd83a13141c14d0ce0eb0a9b2e621cd7e031660970aa4be5f7dcb5d15c2bd2ede463c6fb2bb6bc1abcfcd7a1af96f1ae98ae81d315af3713d000ab889760c12443ac5fa79a48fafb39bef31b3c3b9c636927e868259e64ee02f2f9a5ba0b9f1c4b2a9e7cb48beb319433419798210d720f6879e4cefe84130bcaf22c1e270f3e7262a578ced12348bfacc7ee33573d2916ea63ae14659f467dd8e5f72115537fecc1406e977438fa47375d11d5327cf409aa1ec22b0d4905084e18135917ce073aa8bdbf4d9057bb2e7ae21cd46342745b6c1a43631a5a25baf33e59e461339e402f29d787463c8d5ac2a889e7d740b7baaa588024c683aef08e721ae1f880966e35e8288b4724d97f6feaa0d812a9e876d10c7c8c222742ed14764b183b66100f3644c98ee165abe1f36a2395279ac1cba57258cc5a26aa5520a16d77f075214e439b6eecf9791cf735066b66cf71442b377775018c9ab44312fb5a40c4833d198a2cfede24b5f8bf7e4231c62c5f33669a2ae631b3a116af83acc02b72e05819f01a5e1f0492b5b11ee1f3a73d8bd473bef885cf88b2e8e35189bbc8ae8c261521a0000cd0bebee7295e8d35df1cd49f078e68993fd10373a53eba652a3f4be4016b27961e93935a059a321c20970e694c4678813216632a684de2ba44885592672cf46e54c9ff27d01b29676ec1c058628ac1e7cb063885c6f6e428195a37698c7f1941c3066480ef3d4c8e1b601b6b65c61b21c10bb3d84d09f7e1eeb38b7c94d1fc658c57106b39cfcad009e4e4b93c6d969b0b7ee231234cc1383e71623de0c1930db8a8dbf266df0e2d924da51d9f49e836b82d2ce0bb30f50bffad57cb960f448965a23a6057140f7da0b5e29caa6f95025027be799a52fcc906cfd6f55cc96e712e11ba2bdfefd3ef150f1f04f6d8de5d7f5f9f9262ffd4c0509078cfeffc27d9bacdcbd99cfea305c080c296d6699654e909a3f8b05ec63ed6bf1c01f9b1b1ebcd5c3d34f8d5e8a5d3386626297e31f510a7dbf67751afc4f77effede7186e0ac5a05c4cc7bbaa0ca610433f49bc9518f1ab48049c1dc8e7ab9ac646e024225326431294d5335d627c3a6e9e8a06d8fbda1720dfd868c071682118c570782845edb082de727983c8e4be4aa9196046dd5a92f7e3e9a3d993613c76af2ed052681ad82d8446aecfbd169b3a659d27f0b012c45b9fd2d5b022492fb34176720daa6af6b61d245cdd44a017fcb0d82b4bc34d8c14d8c815b75616a4b8a0825658e903767625b4514c8ecb6bca7e3cf28d065a4b18456ee149ee611f6a6ed9fc8060a06b0f0a6e3de41e7d4628e915808b939e901cd0e48c11deb612f94b1eb4d589df95e2b19077aaff56d57afa46add91f6274ca2117fdf4ec9ad15f2ce0eddcadaddeb39117da645bc127188f7596ca6c7ec46914c17968e3c2c976a4d71f7f8e853a558d6f09cd504e0475641389dc5811d424893cbc25778b3f9ffe28d83db243f69d7fde1fc646d6726b7ed9ba058a2a69b0a368da3d7da417d71552e231c3334b7b37884f84d831e2952e80b10b205eb9b5c02697e110e3cbaecf4e5af641335a6f8c4d00e8d2862717d2164e4ef64ca969d66b23cdf3bf06f801fef9553859094bbc872153589e8153a49c233294fdffd46656c1304642139fecd39fbb08abd4b8730169b9615d4809910dbf0a2ccb1fa8d0c38c950265c77fc4904f97c11c5e59b9f92bc653e67bbb8ec57e1cb7111dbba62ee56eaf48210af4f5f238490a4aec16c6c60fb4d968915a5a6fb7e6767111a6dca6e279498aa016965c58939dc65f55863d7c21b6885c6c360b46772571acdd7b3eebfbeea2a681e8e10e4ea4d95e259a48bb53059650c9914c768f1b9cdc3998558b5c3fb2bb4a643c85cf4ac4582d554fa71a40235700747589a8f837ee85a9c66d18bb3d010bd28f47505c45bf7d61822152e6acd38b3103115e3f4f4839d9ed1fdc3a9abbdb8885274ebeef30278964b4833509fe21a75875b7a1e59aa1f293c9ebb12e2f8f2f112f99fa17c5eb3e7f4991416e2829f7fe1f851fc3fabfbb6c03ca56f72f11e5a21da6d3a6d9696e7de32137173b91c2f6891fe71089510ce634749312f9ac7124ad7b6757e4ff3d7594057e65742c447d56a91e718ce52eba5bd2d70c9fc35c463a9dc1c8591d8dd2092a7f6686bd784de00568fc57ace7ad9ae6805c37e8b751349b9b3ef1bc5cb2cd17d7a11f3ff522151311ed21e0b9c9c5ad9f1e4787e9cca1732f1666fc70b51e9764e66d1b9d30a1d88d75524d3fb53e5fb3a618b50200ed743ee6b165b147726120793dad8ab8b10e937e32de51ec7e3f2a3dbe047895ea4a6ae75739ec0e004cd0ee5fddea612d85a1ab88d7d2736c6e5272a40a3e47d013763d5a9b196a4c494ebb2ad4c6f72dee216b533bff8a61fb1a5dc95f39b4206ea2530a7844e77df2500fdbe7ef344d09898b7f3c5d8c79e3f9e9e99981c3df0e3dd7505696fde18c154f7e02d9bcfd47521d7381c93ba2cf41d78f561a3f53eccd577758e03fdf162e38e6b7ad8394b396bfd6aafce275591df4e8032d64784b7a731c408694c16a338d771eae93499d4051f8c668712f2c64fdd596bbb9a10a35766928428914a38b8a557856e13f97eda358b4489ff9ca5d523841f17f746948d5aee5698785e51492d8b8f6b6ec652b0c876ceffa2ed67efa633f66e21a5f435caa7a7dcea449d8e8a9bfbbbf8357cf2380a303ef8660522910a645ea39fe978baa4a3fcc588d283046b5267851f872aba05703ad893f89188b0714dbc4866be93dfb1d0d04e374ed83abfa660da4c6c609a3274e432b71475270e532f06da1210163895ef1d4a256adc7f300262158de51086124508d017712fc2eb1e2fd2d92222ad09b2f53009ab06d9bf5f3e71e7383297e63ca640e44389dbb99cf0f4845f71bcbd058bee28d4db1d80a328aba88bdd9a80b726bc51e53a92960a985e7b86ea2a8e88e6e3641180eee8cba7303d54eb60aa3860a0505a143ded66dc49565e0a80c0b31fb85f4966a2154c9d64eabf2dc8ef2a2014cee92a3ba64c27b3bffa528c9bf353195dca0e95329d8dc1d50b8d5f6cba99dfacd70180ba326bafc24a472a65a5929d7928b11443974187af4baf36da0e89ce5f08c5bd698fbfe81810bfd7762c0f5d975fe9c778e4f1166a5e3d8fe0de5a195e128bee49302ad6e1788ad555b9ad8ca4892d11df7867bb6edadc878894a0e199fb4bc05a34e04be99f27af0916cd68dd2fed1b2e9582cc30b8048e2f848d49d2955fd5ba97f0daef913749324112ce2864ba84998510a5281c1df35afedd4f98e3eb6c7b0c0a98b3477bc07e074614cc4d85fae7a151dab1a2ed42c43a38659b2fe859ddba5da7d4f2a8f63442bca4dd3e11b4b981071d764b8e02feed5b956eda0b872885ac801b678a54ee120e31429866ac759f6f373a0f1b95a3f1b42c1087371758e01278a69eff2eb0a2f1221629d020c7754b0ab0de3a0d6a0d2cb1e90f23fe08faff863bac1c837bf6696b734d066596022331c3d1cb3c3bb9be964e396a1e856553b6d968b73066aed50439d8e9a64a332d02a891c1d6e29a81e0bba8ef5a9f86683d83d72391b67b62d1780c77b6457a265da0b3599e0b7918e49208cb5cda359676c8d96191547ffa8cc717cc7b6a6f449349e1cc4beccfe7613f0d3b715e4882a69ef9173ac2c261cb62291602d61bf53ad9652186dbde45ffb908d1316e4ed3c1d0b21e95ea66745ca0f5d480f690d2c519b595ce82e967644cf7b72c9cdf158da5a7e8443a6c7b60c129f2063cfa9b9f8989065880eec8dacf623e93db8e99c09cd5d94df9ef277ea6471ac2911a3c86a92831fbcd52e3b3af31ff8445f043bc48bedb11069ca2b250ea31fdd4228cf2f7735b6012dd9027594afd09f0b5a38c1675fa7f6035d3b5669fc3375cdf438e635b62e7b4ddd003c8e366671bc8e9ef38d448a48e52feb48510daab05d38fa18c7d8c0b3a5e8420f933737a145de6130c74925bdcb3e305a07202f91385af1dc4808d026d33e6dc360391b8358dde02b04e6935c783280eb340fdfd4d015d2e525dd18cda917730df9d19b7eb51ec0f53b3aecdf46ee9f68fbfe0c71896553fc8e85115080ce5ae3937d69820757d54b4ea04476815a5321ecfa8667b5ad5059a4b5c9e4e0968a38900c7faf1d52b895c8420f1ec7fb4839fef81dc2825e602ce89f3c06902b61fc0aeba09483dadc596819019c54d2d1c52ef98bd2f7e6c3053daa2cc69529515d9cec00aa1a6aad3c4f093857fa82cfd78bb540772400277753a1196bd4005a91a3650f65460b3a9a36d6c53551053b95e24d1ec4d078cdce647198ca0463cd7cc0501369399fca08aa9df985e11bcafeb40899d419a851af6398eb3c15ce33a3d90055706c1da634e3120aa28de3eebb9bcb14e7dc2e11834b12347dc58b2292aa14513bb993b78f8121cfbd1778e1ee331461a556887a63c6a67d3265080f3bbf156f186a26bb800c35ac68c0a472eab420aa380146dc9076bc00c65e75e4dba58475e8b2c77b74f292db225fde4f6d2a959f162855519f07b77677a56c7e0e91c7154c9d20e400eca9e868e8cdc17027ee04164bd29678d7b8e6319730f060ca1b246489803918f62f9b7d759add3f3f4dad0a6ef1de4f4077945db34a570cdec7f7958103e0f73ff1ee8c466ea692d1dfaedf7e7a7e94484e1ca6204d044f468f4527844f765cf4eab0a33a680d770ad3507002e35ac84f6687ca59e4fcc3bb51955b2d4d98068d5d44a46ed5ef40704d3fb7d10154f4aebeb5d6a305de2cb6b2711c5770bf878f39f35779620b1d695c2904da2f6a595852630497caae4cc9a822c4751b51cb69d635e6ec47d6972a29c59515e2eaee01a5589c03bc24916b76c32ed9b78950e910211e331b033c052413e24ae325af29db647dd02ca06cc5224a8ddd55f26ac43a83d96e0beae9d7b9ffa31d515340cce114c66a177f8d7c291bdd49c1490e880d8f82ce4ea6f7651404d81367362f2a3e9b0ce311eaa8fb8525cf8690a8f943ce49bef0aa03caa44fcb439b8b7a31a72fbb61208a04697ca3bbf8b5a0606341a0e784d6cb82b093b274ebb4cede80485b612e321be1166e3c84f2bb1789b343863ebaf12ca70a92ac55a78c7998764400fcc9812fc3e8737af721a4d5cc5264f3a291f25e2b52abe5e07a38ed0932614e87fc1bee6b2a8b66b83fbaacf3f1b49270f8c78c5468ed6a7e4d2571d60cb9808c8df22161e553f1fc3361b0d4227e26d087c80693ae4c4477afa54cc53c3b15e1b3f4e137f9366aa52ae0ba3e5f2d50c84d243d55326218faf8ffc2d6e5202bd20e4823f1b4574181a7470dfd658471b2655b40395dc6359ae87a53f19edb007b977cff3c4b0dd1b2b23d4f4b5103cba48612cc2a8d1dcd208f85c903caeba0e6d3a7348a6129c86843df4bd2b5a50699955e9c1d6c6200dc5bb2d90df887813da1b9acc7678755e24da71ba4f60720b57ac93e7f8ca9e4c9c0be6a608008e5f5ebcb631542c9c2f6c408279633b43dd688ccb4679ea0e0d60267f194210ac7d7ff258f76525bb51e2ef7d72bb10161a72083e7de7ec3ce96f53ba4f83eed496525ee2ec23ba0e06713cb094637f2863d945432ccd307ef45e62b25266282b5227cbe0c9b27e2eb55c7c15510ecd3145c01ba5dfa6b57ba234d1548cd65e851953e0fe25805acbe0be413d12526dbf031d07f8e1177d3377a2575fee0dbf74eb62d01187af05ab977b1014a5f52a5a6f20de227f3a537eff328edc4a170dde3649d6778aae839e1e24793b44b4251518f4f39a2d87add841b3eadfca7f57d968e27587bcdf516b425e59866f31c19c2ff71c575fe262536499d92873266e559d4bd873147a449dfc72d80770e045c2d02bc3cf98270d5b66031cc3a8020e688c629886cd664a2e9e01491262a51d5472440257dff2e991101178abdfa061850683747fba1575df27f75a96a4d8aa64da924bb79ebe2e1e23ecefb00e88157f648c9ae937a5cba7d26dba81f9fcef54a4d550b6977656fd6be5226f77799b1b731f7f6f9ead317bb6a370075e4b5314829a0bcb4f67f35435df3a8303081a1d427409b01ba7b9824af827759643cc07c9ab6c20fdf9b94a54a3183d21b6f475f7b7cd8a515c1cef21b386368a39d855a92eabbf9e691ff24556ecaa9e551a8c415d89a0305c15cd8fa9838fca767318f14de9197e878c573bcc853a83107909311d62804fe87c3bfb056cfd43df4c09ea3a0d21f933bf722bfc924d1430ba51efba89d0c5e9450eb71f9e016ef8833d0a06e59829e66398b1114d39479f03d506394ca034388889b5333f1d0bc9fd8f09b7ec5cb4589aab56d96b2a2d16aaeb74d81a011ad5e54bb686c1a8df3a1447c7dc256cb670644010f68c1433c187b32920b9311ed70434f597258ee69a55ee5434c4c80623288f8cc9889498a5fc6653f4b823d6c3e6efe83d1bf4950ec13f9ffed06013b0721962ea59b8ca86cc06f05cdbdd0d2305d93abac05726b527177683bc28b149ffe1fafa89c009dcc0caf55e1d9bfcd1c4fe397d3c5fc0c6da383f4c41daa66263a471ffa9d981e47f85ed33653fdadce24b56b94fb30e567fc6184e01a8905a7aeb5925859118a1060295d50487ba0c1e76ca8f99e22f99a39b809b6505842261b0d4deaf7d83d2fb26bd39d2038bd1353a36ac970cadfdb87056420c78d63ea2b2a7b8289306c163ad35031750bb6adfaedbe1a7d51f5158cc4b04321c13926f56809b0335b6d88b5f779906cd0fcd5b7c0f0bf6d57490865b51ac8c9710997aa076ad1c40cc145e65c02d25485362c3f949763200c123e7cf1bd09cf556070bc874f0ab53e6988f439980de48974db3aa17f6137067fc13aaa24297473b2302d7b44265f473fe4455ee2f9d773feb52ca364a20df1ed7c6c78be155870a586e2132871ea4fad2b4add1d2c7040b46554c5b8586744dfde9612a76439e16bcaab8daf5cc20d89f880251a9fe6208c314095da7ac5ce369c57a576361cb1f66fe1da7513f997fd3c6e77b6d166592a749034ea50feefdc2f7a1bd4e6ec60fecdad23fcfcb829fcc8eaff523797d9dccc24145816b74161f3f6c47ab2b8632b0dbfaf01938edb025a9c9dbbe795dc542c24bd7135c7c5bf361c1c3bbf4a50497c9ef18ebab83833e4452a3df9657850d114a9d102ab023ae9cdb3db837d1b321a9bd69d9a278b97d1e086a2401c1ff69f5b228bf2b6cc7fd1e4aa6433c0bbd64a74a42591dc0ddf278cc12313d7d1b81c316018206e1f349b4ee5e3ad47562795c9478d29946e442c4494b6b6ae6415258f179cf340a9f99f9d16fab1a9f05726e37897d034d3f9b469daf9fe93e4c3994196a07c5f9128f04a17a8261a6e527629565c2890eb803722ec91e30c06ff14f407809e92f184c45440b20cac6f6be27fa691d140e8e584b623ba07dcd1ce6103c844f125671c253961ac00310fe5f4ab96bb88e7d7d7e1ecf63b5af80088110724d6a5ae7a4f6970cb920b3c055d82daf8e0b1ac53aa6679f5ac85959ab6264dcd6528d5a3f1a7c7fb9fc0e2ae9ed1e10a3331a450d6887fc51b0861b5f461369ae74099b381185fe076e2ea69b9eb54a699c9268fce1b3a07daf6b5dfcc4c02975307c9e725c3047e0fd1bca91f3133a5a14ba5cb001ed0523a95984b1a5c1a57bae0f3f556cf9c0ce59c2c4f892d0502ed46471a6745a5228adc2edf9f892b906b5c0e4e033feea3215e2b140993432d4c96c91e566cdea64a5a43648440d6cdce43c803ac6c3532d860473abb463d0737e6634aa9b20c78e73c3bbabb6cef59c8dd38fef882ca0c68866737731ac94fed1f8ffac930777301a35eed5c538ba913a1c63532c5fb6188b5c16ed280267439dca48f966c2a43b4ffc61261a17aee54da1afa7b5d2a92245beadff99989eb90a7c1acd3c6a066446987f64cbd6363bf750761e4d7c6c67f15118f782c7b9dff23b61bc124650ca02f0c8390dbe4ed73f994e1e5b45644838c0c6064624dc7761d3254dca99938bf376bb979921dfc19864a0fa2dbee6eb33800c50e4867e4ad14604e053b9a6339d5aabc5fdfcd160626a11e805572666d182eba3d983ae48df106572c7dec35eff7078d9ccd7e507c1e9a6ca2407231a0783bf13d201c4ddae4f9b77b4fb855f743aee3de013ba45d8a6420a476e52d38afb23c75f2f1bffc4f2ce861daa4ec733a757be06c5c63d086081020ded0e38a7ca7ffd27ba5cb21bc403666f301572e1763b2e60a7c0847244f540786740d26f0d1021a2b81ef853b2f07109f7094d4ae75f4e84cf1bd63ab94cb6a42c38b9825572036ab6961fc49dbb24094b2de3f3365613a04e557359ead16d4ab1e73be6dd71f37e88123c8b94c25c8b2bdeb89c517e413d9d09c6cba7aa3e573a1f5621948761455c665b713877db28d7c062ad721bca8b7b28ecc060b8ed68b461e9db67d4808e9e2446ff7a9f2e59161e6a0fc484afacee5843ceb45e6fcae60af3ddb9749f003d9889039039fcebab673512ecd739ff5b610a9a90029213e112cab2d83a709e19c7ab3ec16bb60b0a53f654f55ad2b734df700a100e5f2ccb0cca15802cffdfcc8076c8f22dbf9a8d42bc6e00b4548acc9bfff67c5d812ba4b35991d6c58fcdd60cd3f708e06ba59abe93bd44831cd6e403fe2d71b54ac7d813cfb4eb047bf799bc95f460fce9549b7a9a489f4ad105795689cfcdc9225ebe59299f6989b58a3e0065a9f646d82aa27fd954f015889562bdd4f897fe642be846cf3afbe2acd4e2e40e842ef4a44956b251a8bad504676ebbe99851701584f2f4f69aade1ffc639cfe3243729c938c15f26f8c8571b5ae94b02cd95b26715034390a1f1648cd35b1f0614baefcd2d7cf27530d6cf8e26f553ecdbebecbc1f6b0f2d3f152c5add956bae4422470d5522af30f13dbeed7580f2d3c9404cdbacd60bba697e85aee7e54ff7b4a6217cd29730c1ab867cf530de44478ab8c3e57c51866136b0497b89749c72c2fb8ae2b9cd77ad8c6d1af8878b66f64acf9df52b15d9bff07669794a751cf198cb5b52228d9e810321dde0381b9e294a60651e199db8bc0784ada92d86dbaf246584dc6c482ae93fe74cfed9d2e708f49de7513a07cb38724c7ae1cc3a2648c1c394fa85c56043060ca058bf7dd4dbe8c515a8057d7c56eed326905f25f00d091a9f6a2e5c528b670ed8d20a1338100dd2df256b7038ca7b92675138ae0283cb9840c9363a320d4ecca6e37bce9776ea21add8af8d470a33dea35c40e2fe88952bb3791de1677e7b9c32acb116e2282c2c78875c685ec1621da3bf69c3ffd3cccd9f0f0b08fe8f1d126f9db0440280a00dce41ed7a43ec3e6429f119ba69c536d6e384fc39715c54bd37d0de9232dc2cb4be2c437cd2b225d1e663e10e49c3de42bf6bde842fa49329adf64d81b1574c368a443aca940dfbe491a33b63db32b3190fe67dfb7fb86994eff1c294fbcc11ceb35ce80a600f80b8c79e60a88a9a38856535203daea2878362368f2e1441f5252878b016cd943828f2eb46da23adec24265b6af97693e065848af0157b3a6a6c65a04b0bcc8755eb1acfbec2792364ad0ad226d5c5a3e7f9ab49de80a49acf8aa5c7616bb4a67c26bcbf466eef8be47fc155ef610c790591cecdb2173295bec56ebf4fd91ef9fd499fdcb68f36e11e6c618b84692cd0ec332c32fa652d952e73c3e3dd35c55a9c05f9b049821cefafaf3a59d7680aa9ce02472e2fe5055125c9b9ba2a7b25d5f6906cf88628b994085604f93a3f72c71d81758c471ffe2e3aeb47a8c17fa5d75276d4fb1123b94098ab68066b45f387ffec1d1c79ce8d905705fa504c8d6811cdb28ff827c1848292ab86f43787157dd05764ec1482f6adcd99c3d54b85c1896083cc31b5c8026d377cf8a4ca5a18cd75f84ae7461a81045c0290558c20fa6956c4f58755dda891ac458a6c915a2076467e537eebe355505fcc2c973695d7dea386a52d2155de2dcf4747ee1374bfae34f1e26bc7f26036a53735013c670e5a97765f637723a0404931b578979b94f25de1d78b8bd6dbc8190112f05654fcc37a2e3af0cb2218c27af91d96b4dac8c15c7891b08e339780fd9cbb3fc54ee9521ec8039151ae5b447e7d818535cdf3f51fa49a9099af7774862866a17bd8cc15acd395773cde28240aef35970651d141b1b4dd950f79db94e41dc623161575815f52f34b2c009c622a8dc0f5e3841a36edfa29f450341137d0a61620dc62db96d6a54702d96b3c71782051a54cf1dd63fb6ffac8adc98f0f85c2d472018d4129e2458df225c357e4c77af6284500ccc6512dbf2368e1057a2a1bb6e95cf5e2421fe6f0b616ece11b16ee36e39ac2d9919423c7d59e77810173c6d6395a93592b4626886ff32925dfc8d6d252ca7b642a8f96bec5b034591c8a8dd5e5bef050e3250fca3698de501b4147c104889e5653931be758151adae8edd7c7a859048951f53eb462b6eb17b571b9324b9e45172bb5b1c93c6923255fba2305ca28cde0c57ec6da95269c836cd41e3cc9f24116267ca0ccff81d644843f10689364df823e60110d295da8a109b616f77464182f1e933abee28bfbe3e893bd059ee8983a0c28621dc1d734c04ab7e3c39650ed778a7afb22e811aae45b0cbd8f2be085e01ae9ae29d98ea42b353f053e1b3e62f0260fb4aaf91c94bedacb06c9814b67792cfc18fbf0c74004714de8146a771fee831a8819432a549765e3d98e0381c4a7595d38a2415dee9b38714ba48f3c1346c2e5a92f5a8a80ec390e78e5faf01ef784e7f9a89746988302cafe62ebc6bea14110f831a65c195a164741beda5d652b95a05b22573d231f7376b3b80335d3fa56e8e72c2dbc695f5252b01966864fc7228549da767b82d7752558f7ccdee1fd86cf25b09c0bf84e6286df14c5cfaedc4529f20863117eeab700bd3cbfdfffa778aed414080fc42a8bdef1901c6d770399857789d317faa24cad19459b7870e7acaa3d6eeab55af56976c683bf101caa052643c878fc505476e8e9e47a9cbe4a9de664d58c79c5c9b66a524c631975db9d4bab2706e97e207a4acaad781d453d39f7a13297459ca8fd3c5486210568907e32505764e8ae1315c2c38b82b8a2196ddb0ba106aadfe33e9c80d6fc404353b4e44bc6695535f505b2e850f3db9741e6aab44cffa74ab724f1a064f4a6db4f5ad8eec214dfd50f7a48b42faed430a590e582fd8af38c59dc0732f03a39130abf80bd7cb216224990b0290f837c605dea7c9ed496a879ca50756c22a92036789068b7ee0b4680d98b0e5a2a3e3087a6eb25e717d18f393ec21ccb7f3e4216999d30ca8589fc7306f11d49e2a2b7c43302697d17b789c3bfb8b1cdbf4517033b234913ce80685bcda0ee097f8a669054bbd016d0f6c307acc0cd308d59cbdf7f87e4aada45e74bfef42954633481911d034ea97cac9323a4799fa82d4714ea6c8afe0da1efa2e9d869e1aee36a5d67b2d0511f77de5d325ff0b42e06c2bd8551cc0cf5cac7c958f9a625ce53dbf76217b52e473d57d1c906e24aa8c34d192ee6fb88cef39afd66b847e6ea395eaddc45d12a1586eb769fbd21b955ce3a499ec868130c8a6f22abda5a5c86c7acf53fec0d1373feecfea2a35039b1dd5f875e715a28224a278ce96ee79c13593e2cba3025232e08e9214042ea99f9380e35587e160a00b41b70f1b0eb4dd71b07336f46079c25be95471de8b42a9f4fb03a1ac104d4ec1ac2c3acd51058d10ca9d3b7b5657d7dec74845d0447fa39bda1fe7dfeaf26daa8fae39fbcdf733ef7ce643572c5d5feefb350df7bd18c9235a41ecae829193e2f47b26408a7b8e9e844158ecaf50b395722a6a476a1bc1212d9b3430c09e802f0d3ef353abbcf29e0fe0358237e2049d1f93e660f5ded31e438b8e7393b68cc6880d4901044081464687079bb02607a4977416ce5d1823d1d9ebcf7562219a2bf767cdc7eaf0a159fd12431106a23e403812c4d948908132242e1c97fabbd69a565b58e922d13a728e92b04c877e05e6e4d877a9d0a3d094305d89495cae047517463b8cc04fff0adee7f44858a6acba6c5b763447b03a42c1918dfb70f54123c18920b0597363af65b66eee6962d91221d23565ea50462518a8e60fc5ff7964e11cd80d04bbb2412e29933c293db3ec78a04f38802ace93251af084677107f9b580f4890a1c6bd45e3225364a042ca09a6a6a5aa53d46f1e3b407fad951694d4c3742c43e10125e8699f48a8d133b8074995abb90e6c1d757aa773558d4a4aea451dafe0aa9b4c926efb29afea8d85959927d431b3809b69c2e65b59e30443c66cc6f864c6eafbd7ef32c8eb7a1dc6a663f5e02acc2249a3a98c91ca21a25544af94e246616c099a4aa12923ffc2ee23a3694098595e2b8a06cd236b39c4977c6e3a1e0a98b4120a0c360bb9127e332cf3dde68d99cb086b9b0ee25dc287e2d3f5420330516cac8a4e04449cb6076c795274f1c54b0ff8d554f38526b09eca3771606195c5c51c7c995548e91171002ea86bd4bca9c893691fae0f689feaf12201d31d0f2a1a3a9ae7e3b70d787bdc0c3a2a76c9b5713ccac9026491bf43b5323140ab2a0547d84ab83a48369baf87565bd8733c6fb9cad027f435f9ef0cbe3c402e5182fc8879b7216394b33b855f48ca8b1f1ac798bcdaa6dab95be3da780be57dff876a641e71f5da35da0490d0639b9c178c95fcb0e1602ee3f645367b2c684b90cae2d4722a1d54afab89642e008970d172d229c1fa4963635b5735e3c2c4ae30cc47a0a906c85f7b38a9335a24e87c2f74aa5c94902d4ddd087a9d5f65cc3fd5cc543545854a47a4d0a53ca653be46c4c0a5bec89c253344b000bc86379a86f2fabde29f2b56e08d6eb3278689e3611b97b22bbfee3d3242b7451af288f34c3ad642ed7352f182baede02a5deafa1844f1084bc4b5bd9ebac1e5766f7038c65868c970dcce1525c4ba4557cfc8647ec40f9043c4b7027350472693fb7371c7c212a368f1191f1cf1872aa3de694ebe05ae0a4f5ede7131856c643d7bec87cb58c02bc22d4df105cdd1810d4b9c07fb41f4cb824c03ac290c3a9d5a76492491616355679ad42bc98b06723ec035049726cc3ffc72072ff46ec39a9e829374b6545d5a2b5ccf34fec3f1755ca0e6e5b228e0674d8df64e3b8de4ba669490198692837079a8828cb0c2090ded5cdc360f67f21057826e4834901f4d306114805513678e4823b290a28beb8204ef99ca8e0d6429c7aa3e2d6dc5ea23ff89d325352fe7c3aa6f47f67d26cca3c51c383b62d27b009235af15ba039e84cc5755e61052f18ff2b16d2e7fab90e94cf30c36b68c2368727cdd247ada97ce1b5ca19e47f42a04c49c1636a68d74e5cdfb53a237d65d3dd421b24ba59ee8f6d47bb3e7bdf2472eefd148a9cff0422d8fdce5a87c43ff8c5b33ec890e619a190f147800cab6d1835ba2bfe2d932e9e595a87246346c5468f1f7db9bf08cb1158e2dac85ccd8ffe8189e30bf0487cdbd5d1fc1ffe34130b8b1a2191c0858d64f1e216a45fdd3e5591f787914cddb4557c88e6f5781d486fbd0c2dd7b68a9f3a9e05d2d29e7aef4f851d421a26d826fb69d1063815db49414296c7a930467649f5b875cac06134f9bcbc2d6bb9c88084a6ba106a6542bd03a786995d03f8c515cf66004b64f5f7bde8986aa02bdd84af0c9f6f9954e86f046950eb139b09f270be9f4b5fdc355a972f0e136144f1fef3be3d48dcf2929464b8bc255c4e814f000db912e999e59d37c272bd5adfa4f68b237bc851c2510b358d194adbd97f6ee38458de219fd1faffa0ab3dc0591aac11f61a3a9342c085d23b6c844eb3ce8c0dcdac17553eb1316d89ede3c84622224d63120f1a23cab58f5462386ddb407afc118398e304124df2358778987f85588356bf2a89874b9b4f83e326e36c9dbbc7d761fcb81ab62a72f0aa03107a5410dfbdc35b8c25e048c25ddcd79ad53ff6cc1b00c294b420c15627fb66d76f93fba4e560163f51766fa15d207b63ade8db5d216b17160b167c098cbc26f19837e15a6bf3ba37f93d5ecce0c14e2c7c780debfa99eba75add973226988bfac7abc0d4f0418469ba08cc4305c60672c97bf71e832de7d48b7cea61ac81e67de5e4971440342624fda46bf6b8af196827b9f85b0ddad4746b67c4ba2d7d4cbf1e7db99ef0a787646414d6a779a05643a821e6c7d22cdedf473e70050f4953d66df272f74676904ec5129fd5469762d8864a3a15819ea7c5a1716b628862e2a4c318d7b96384b75c0de290c035d3444bcd196a3f5ad1464eaa0e0c8a3190cd3d00f9c5cee18c86fed91624784685acbcf82fc86a928449460dc5b791da0e973f110c6e7230bd5b3ec98caafb6d4ae0bbc515664ec0251e66d8f210049797d280563418218f07e430ce2096600e2cb2c797230b403f21ee8e88d2c3b03ca7b3f272b0daf2ce1c2eb069768d92199b31fec315da1caf22e5a422410282772cb91f9a52f7148628889077b3f81d145b8721db54046fcebdf6d9c358c1578f120696e661f51d1d99a44448873e45f02fd7682faf0b7735c9867aa8673b06a91448f34e3f73f997337b47e4aa66248682d88f24daf2bfc0deec8d8a6dedf6b707da048eb899dabb34c4fe53de0fde66e2785d21c790ab1d1584bdfd96906a3ec1c269148a6943da1c537baca09b8adc5b6ec812888e232c76c29c0db0c1c18bbc93a81920c6509aff95fb46704b342b8eafe9581c43d61a65d135da188d4d942bfd0effa1db8e068cb6618f8bff6c0fe227619aaaae571601e749fcedaa100be7386a3c8b68694eaedccb2b9d2e0a6356a0f8bf1b7a2fdb3cc696321fb76a0c35e3f3784164ea184229a60deb76fb919e6860813203a9cd502bb542a216ebe2a9b458daf52df6591c6c5f16ec34b4a35f5c0b5edc4868fe788465f70bc7340ce661d43c178fb6aee2569d4e1f4152d1acc5a32879a6c28191828a8410d28959acd2e51a37619f3ec1c72e425a37065f49a1cccafd1f2b517c2f058133b0a36ff95b6d16274a7776df502bc3909e67bce5d1bd8ecd3d86dec0344c14448ced0428b06e309ff6b61ed1e128fae6728c921f3be87180fbdef2faa17014be6a9085452d7ab3133f51e41ed39d14972bcda0449751868f847a71166f6336df799fca7118e8b474e077d2ee6b73be947c9d3e53d662c915cfcff1f09d67268b0f2767ee0dec62708beb43be805c0b4511b97979176df458fb1a925ffbb05e4b7c58a20946a2ae788f8c4c1559011bdbed1cdb72b7cd8b3bc07f4c281a43ec59b2e169ea9fb9fe106257e8db9207c739374535f7731ff817fd6a97da5aa710192f4d4a88abcfc03ba764bc7e5b372ba36252ebaa2cfcdb05aed4e0b27401e1befc84ecdaa343a4a8185f6f0290ffe91d75b1b2518dd4550a4473e48499c5a92fb457ad30aa3943fb505c14649e7e1c73824a409b28b62cd7363d112292325edefd2f03c936d84995bd6a9d1654f69ff2305fddcef8421c6fa5e95e0804d21326f29090661e8b7d29acad4ed70088e0a02d9e0c20ef28bcf6c6e37f0ea5e8d101018274b1a9581cb0e4ffc249c6ff21507ec348c2b295e0a78295c70db6da3f61e3e060097394d4dd297c791ef4b56be9b01a29139fd0b69e035c332179ab95b905fa9206a6469c25f5b040e6d41fc75c41af2551b1e653bb4cdea718bf56be7aa323ffa7caea162d9737f25854562a0e86ff89bb5933016132a74321b229255a7722120b1cabcc76bdf4bab94b18a321414558f4363d700eaea6b036f292ab2ccc250a1acec76075af3157ad8e301d6c8a38a4cf5c3de2693876f0454db9353919500d13528f47452c4986d3fe2629a3449e8d878f64d29b34b275e4fe742363f99640c3fd23b3d389f23ffdb261c466726dbbcb3c34afa274b28901d1ad577fd38c81fb19bd7550062bb85d31b513614780a02b6b5e3b5b7887a79b97532d503b43d1c7c48c96829feacef3c031665551659f32875674e20f38721cdc1e641ce9fe4e9dfb9e42bf08fc28ed0b03ef218d0b0e127b5046a9b965d8287fc07d20d688150ca006c79be06c7fdc9bb7910613ff3b5ba73d67e8dd2657407b021cdbb78ea5106f1646e9fab0fe2816f78a750ded955e761ba85c819d46a9e2a5ff21cdfc247b7350b0f8ecb1b82b1f991dba6d8b1e63cc69d4a7da94a552e695c6ca72da158fdd2260128890e396f7aa3b62023deff2db64c9a39b6030e9b39d99e280a4fec1683e09bb3787305d649f7ebb7bec1c75b1a6ea0259b734c14a0a2558a99db4acabfd497d51adfa4a46fac0c29d21fc027f0488fb7a2952e576fc9efa0c6f3bbb9725ee8556fb5ab129aa3e3ce912b2df7fc3c15463f649844144f62493b9ca098c5bca1e14e2148aea9ef0b851400b32db71827c0b0b5f8347f36f3e78f2f165f8e3fdea653ba81865efca377df1273b6a1f5df53aada0cc162aa096083a8ff62f6bd1096861fb1aae2851b4e55feb071284c12c6993dba58a4e938ec33d897b5333d67da388a69569a5762165ac069b0f9c00cca0bd1139c96e8265c865c2f8e7c39063bc077f795749cb6076df4588e2b2d07853a1443fcab992c7be89857a004fa930864687868405f9d06cd44a0122e2df619de0c07ddb7bd136ef66b5a49f7c6251915d5361fbf75d8acc6471b2aec8c0d8499c78ea80511fe930ed6f8ff4406b5c061678c0e23dc998804dcd4c7fc166356e536d84a59bc35fd2c111c7aac8ac8c29f5310f40bf0161bc7950978b886f0ce03e2e053e0d426238e9401c126d362e59556ff6bbdd7886000b65fde3390be7c2e91df00f2e15bdf77fc84040f705fe1756c4402679479a18fea45b24ac145764d68c03b2ace1ad2a40c67b027b5a81c8e29ac5d69ea33c39e236c7f906f6a8445b7a88ddcedc5d7a5b3326e9192aaa4b13e12469a21b34c6709660dbbe4844ff9aab8c1af58a076ce7dbe92a63aeaa409de0aed0d76b0da0578f55c4d6cc5b77637710c3498c8cc4718da0efefb279511b4a026d613e50a3fa51401fc786f81708e619a9369b6d9d5daea06836850917d835304fa3d6dbb4dd72ac7e624587ec2437f466db42e2d5c8bb03eb389c0482c087b6c2ea1e81f13a0b3772e452c3d640583c9705267c10d4d5f88f8322d2df8a55ba2b2fd5c7cb1b905a0c2822bd46d86e73018d96953491224866bf73b315490b2cacc59a13c14ce68372fc66c6f76a3ad62c9cbf734bf90b44a0c04f2f7545d501c91ced47854b3a5d3773420c653558b73d3c59d7d3c1689db1782f2ef33fe06b7418229a34768351cf11f61eef9f3839d3e5530af4d089305a32ebd80c97223b67047148a36d8c3eca73f31f2d94c04d70e89173ee68501de0c945b74530795598204e145adc81502d83c2944ecc9a6c42db1d7cd91682e05051e93f714505d75c1553d85e4217ae2af8f40110cc1dc88a3b34653871ecc50420cedba771ff2502b58f3bf353d62b68c365f4c7a6603f3c2a238d3e98594f1ba6e1b08eada2918519a628a45ecae4b17fb39ec117fa16c9448fe1d21645120ba850e71e2947b54cf87c599a6a2827263640041367784ec51b9c37cdbb3627f76f21955d9876ea0283ed22b5a07cec34792d6f9dbb505184eec9ef7f35b8237fdaf2b05fad8d98ce61c635c10fb5d803f9096ed9c7205b421482557f2f7c6807df1f893568181371df13935446ce065beb87a55c2dea524b53c6d4fa06a7806e31ddd78bb4704c5764b66c793128a76b159d914f5d76543df761e1db72935277f57a7a7b2ab9e7fbee199d6b4638094cb89b66fbd8c82e179f53234e5abb6ec764690885115cedd1677f5c8b2887ad48de4af560fa3fdcf7350cc5e6b6b90a23541c6174d906278d63a7b850380c412984e8b16aceb3971f832e85ffeec27da4a05c46811bb9dc4f3693f6036a1fe551da2d57544f4c85708b06f137692d30fb2146cdfad11a65ecc4e0e1afa9f25ff22858b14efbec3557074fbbf067122a39370193dfeb1b41e38b24701506d64986a4cad8853a2a39028e29f46e08b4ea0a88d180c6762ff166212ce8280c6ae78665f9c70803a313030a3e69c41f93f246738e7d5f9862f9f1d126a5fa1d67b18c6a6480c8ee7f5f5b5d24740b6d55fb64acd9435b7d0b6e13abc83a76e075387f6b93296293815504948933d97c33edd95a62f0c28db4d179e49bafceec7973b5657285a7eb9420b22caad226aa8b055495eba5974a94b17f3c18928539f7f4b03e140aefb83f2d5c2b96f74bd2689ef465777f03672d0d744f2aa232e851e5da6dbbea3ab5948b65a60872de801be0665553d27f8b831cd1769bb4cd61140cec1c9bc6677091656eff149a9546ccd453beb00c4a1851f7a67921978c5ee2ca83cc84ad7c5687c556f227f97a6271f072cab034052b22046be0bfaebad6df055d007fc5d7b6cc63aacf4ec075a0e93fc4adf32819397db79d38193450e8fe88e8effb71030ce29e62d64497c1198f8190d3b8b25c8eae993fe86e3ec3519a7a56d533462bf20b7066894af483442d6145cd3702592f6ce789526904b9a916e1c26462338ce9dabbc4ced46be7db7203dbbb84a3bd575a5ce2a624141e7d57ee41481a24d9fce04a6597a376d843ec7f024393bfa4f043a3f0a0ee18c5c8d990cff3c9b6bd7caca182fdf365d03983d95c5bf21bd7cd1929e57817dcb8d82e932e9d4e293f7c7adbded7646c56728c99afde5bdd68e219a10fa986766ac55ba1f05e6e73f0ca5df6826258eb31d002bfd3e0500171cdc9f0dd4fcb9955a058f83b15444ec721c431b9dbf103c252bb34ff11e2eaf153ff5a061dc20f386297e36a7f3ca746aa3a135e479e0ba55cceedb69a7f7624fa975e048d763b3fc94aa7d96da972ddee7f91b7f00d6c1cfde389f4ab05c799aa106556611cd123a26ff6a23a4057a3b2ff2569dd14605968e76993965b7211c5b7405ff5c89cdcfb36283f7fa82ff1da9e26d0269fac8daf9015b93b3b536c5b00a2c7427e199d9807be9893b67f03a9a1970a1a046887e0a8dcf4e6a2cee57ff26b8a664f6c836b28b20082d0387e02d6d42adb8c5f126668c2292cda1123b85e39ffbd389d832138eaa1500b06f16b0d0e5505c970152194e30f8bc3a2ef01385533daec68f3246ef72956036ba3aead3d62e879dcacb7f505698c6687996ffeeefe7d2a0c3648968aec1e2b864a9b36b8f08211e8178883a27a079fe072f08ca49e5ef1ab910ff56ac7d4db6a0e25457c230cf920acad2698536ad3c6bbea096729e2687057b1d998103c0dde7df3d699a35e5b7a297dcae7d42dc5e6a138adada3247fd200f3060be71eaed95f6e17039650bd67ed21569598bba030ca1063affaef3ad2f17d74d33508a3c74b0a9a536a7c4109ffb9bd1e1ab3ea36555c2522f1cfad903c8a51e91cdff895146b56b83fff4680123b35a193c106e845f575c9b983e338793bddd57a0c46acd9298508e556d242d62cdb45e9c0f9bbdcce45a259ae0ffd57dfeaf85c64351e0cf392c4220a6d10c7e178ef8a88c4c1ad63c131cd92df268301730bcfc01f14882e51e9826b793fdfdf5f14ce7c44c59ed399e3a56ab3ede222dccd25736b85ffbf267efd69be2ad7e07a9b6360dcfee822e70f188722d0443239533c664b51d9d6bf46ccf8087116d5baf8dd6e0077800d84c309d7d749851f45d5f843cc369c00fadee5971af41f9451fdcb24138a1f19b9d3f166d6af9a4ac580b8b38c3ae8f0822640222d3563c611071c5ed0d370566ba597913dc6beed7470d7530b1b8ed213a3e6f37b15983e63f61de57cf0996250af0cb47c8c2cbe374678edd248d14f970fbe3c24a0a35a08b517af001b7fcf8cd9a01a4e909a1247600880a0db14025908498233325773bc70c907bffe93a537d60ef9590641987f23e28bf77550609aba6d5e1b13e79b1990ac9ab8b70e96ccf1c7d685606ea0194b40c68e3fcd64b3da521b770052221807de6c4186166a9d7efed120c978fcdb8380d5be361fcb52b5728831d367f29a8879a61d7eab88a95265b583c44068374cd3f26c23a1c62cf33b8f647c9891733ac9428d675510a6c9dfe5b0489c446a8601bd14bff6f637cb030b4dc60f8b17af638ac775a9339d7a4334cee79d830d735d3186adbc52e733f3fb410d20764d418f3863ed2acc874ca4be1aa47df5c24692638d703df3dfa0c7e7a1f3e9993b8f0e7607b4969532a97dcfd30531b19fc76c331b676881217067428c1403fce556557baeeb389b4146fa043d49680239df3182fa576d48c9d40492c78d029d149f1 + 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark{restore}if +%%EndResource +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 168.24 C +ski{/Helvetica fcd /Helvetica-ISO8859-1 fdf}if +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<4261736564206f6e207765623530306777206279204672616e6b20526963687465722c204368656d6e69747a> 146.88 167.28 C +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 211.20 C +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<457874656e7369766520636f6e66696775726174696f6e206f7074696f6e73> 146.88 210.24 C +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 253.92 C +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<41636365737320636f6e74726f6c20616e642073656375726974792066756e6374696f6e73> 146.88 252.96 C +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 296.64 C +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<4d756c7469706c652d6c616e677561676520737570706f7274> 146.88 295.68 C +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 339.60 C +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<436f72706f72617465204964656e74697479> 146.88 338.64 C +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 382.32 C +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<53746174696320616e642064796e616d696320676174657761792d737769746368696e67> 146.88 381.36 C +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 425.04 C +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<44796e616d69632072652d636f6e66696775726174696f6e206f6620646973706c617920706172616d6574657273> 146.88 424.08 C +gr +%%PageTrailer +rs +%%BoundingBox: 18 18 555 759 +showpage +%%BeginSetup +%%BeginFeature: *PageRegion A4 + a4 +%%EndFeature +%%EndSetup +%%Page: 3 3 +%%BeginPageSetup +/#copies 1 def +sv +90 rotate +1.00 -1.00 sl +18.96 18.00 tl +%%EndPageSetup +%%BoundingBox: (atend) +gs +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.72 537.84 t 66.72 25.20 lo 66.72 25.20 lo 66.72 537.84 lo 66.72 537.84 lo eofill st gr +gs np 66.72 537.84 t 66.72 25.20 lo 68.64 25.20 lo 68.64 537.84 lo 66.72 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.122 0.122 0.122 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 68.64 537.84 t 68.64 25.20 lo 70.80 25.20 lo 70.80 537.84 lo 68.64 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.247 0.247 0.247 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 70.80 537.84 t 70.80 25.20 lo 72.96 25.20 lo 72.96 537.84 lo 70.80 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.373 0.373 0.373 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 72.96 537.84 t 72.96 25.20 lo 75.12 25.20 lo 75.12 537.84 lo 72.96 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.498 0.498 0.498 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 75.12 537.84 t 75.12 25.20 lo 77.28 25.20 lo 77.28 537.84 lo 75.12 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.624 0.624 0.624 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 77.28 537.84 t 77.28 25.20 lo 79.44 25.20 lo 79.44 537.84 lo 77.28 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.749 0.749 0.749 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 79.44 537.84 t 79.44 25.20 lo 81.60 25.20 lo 81.60 537.84 lo 79.44 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 98.88 lo 66.96 98.88 lo 66.96 98.88 lo eofill st gr +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 100.80 lo 66.96 100.80 lo 66.96 98.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.110 0.110 0.110 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 100.80 t 741.60 100.80 lo 741.60 102.72 lo 66.96 102.72 lo 66.96 100.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.220 0.220 0.220 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 102.72 t 741.60 102.72 lo 741.60 104.88 lo 66.96 104.88 lo 66.96 102.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.333 0.333 0.333 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 104.88 t 741.60 104.88 lo 741.60 106.80 lo 66.96 106.80 lo 66.96 104.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.443 0.443 0.443 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 106.80 t 741.60 106.80 lo 741.60 108.72 lo 66.96 108.72 lo 66.96 106.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.553 0.553 0.553 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 108.72 t 741.60 108.72 lo 741.60 110.88 lo 66.96 110.88 lo 66.96 108.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.667 0.667 0.667 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 110.88 t 741.60 110.88 lo 741.60 112.80 lo 66.96 112.80 lo 66.96 110.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.776 0.776 0.776 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 112.80 t 741.60 112.80 lo 741.60 114.96 lo 66.96 114.96 lo 66.96 112.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 494.64 lo 94.08 494.64 lo 94.08 494.64 lo eofill st gr +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 496.56 lo 94.08 496.56 lo 94.08 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 496.56 t 395.52 496.56 lo 395.52 498.72 lo 94.08 498.72 lo 94.08 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 498.72 t 395.52 498.72 lo 395.52 500.64 lo 94.08 500.64 lo 94.08 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 500.64 t 395.52 500.64 lo 395.52 502.80 lo 94.08 502.80 lo 94.08 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 502.80 t 395.52 502.80 lo 395.52 504.72 lo 94.08 504.72 lo 94.08 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 504.72 t 395.52 504.72 lo 395.52 506.88 lo 94.08 506.88 lo 94.08 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 506.88 t 395.52 506.88 lo 395.52 509.04 lo 94.08 509.04 lo 94.08 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 509.04 t 395.52 509.04 lo 395.52 510.96 lo 94.08 510.96 lo 94.08 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 510.96 t 395.52 510.96 lo 395.52 513.12 lo 94.08 513.12 lo 94.08 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 513.12 t 395.52 513.12 lo 395.52 515.04 lo 94.08 515.04 lo 94.08 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 130.08 497.04 t 130.08 513.12 lo 360.00 513.12 lo 360.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Times-Roman fcd /Times-Roman-ISO8859-1 fdf}if +/Times-Roman-ISO8859-1 ff [13.68 0 0 -13.68 0 0] mf sf +<4b757274205370616e6965722c205a44562c20556e69766572736974e4742054fc62696e67656e> 130.08 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 494.64 lo 411.60 494.64 lo 411.60 494.64 lo eofill st gr +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 496.56 lo 411.60 496.56 lo 411.60 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 496.56 t 571.92 496.56 lo 571.92 498.72 lo 411.60 498.72 lo 411.60 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 498.72 t 571.92 498.72 lo 571.92 500.64 lo 411.60 500.64 lo 411.60 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 500.64 t 571.92 500.64 lo 571.92 502.80 lo 411.60 502.80 lo 411.60 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 502.80 t 571.92 502.80 lo 571.92 504.72 lo 411.60 504.72 lo 411.60 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 504.72 t 571.92 504.72 lo 571.92 506.88 lo 411.60 506.88 lo 411.60 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 506.88 t 571.92 506.88 lo 571.92 509.04 lo 411.60 509.04 lo 411.60 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 509.04 t 571.92 509.04 lo 571.92 510.96 lo 411.60 510.96 lo 411.60 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 510.96 t 571.92 510.96 lo 571.92 513.12 lo 411.60 513.12 lo 411.60 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 513.12 t 571.92 513.12 lo 571.92 515.04 lo 411.60 515.04 lo 411.60 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 456.00 497.04 t 456.00 513.12 lo 528.00 513.12 lo 528.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<31382d30312d31393939> 456.00 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 494.64 lo 585.84 494.64 lo 585.84 494.64 lo eofill st gr +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 496.56 lo 585.84 496.56 lo 585.84 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 496.56 t 740.16 496.56 lo 740.16 498.72 lo 585.84 498.72 lo 585.84 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 498.72 t 740.16 498.72 lo 740.16 500.64 lo 585.84 500.64 lo 585.84 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 500.64 t 740.16 500.64 lo 740.16 502.80 lo 585.84 502.80 lo 585.84 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 502.80 t 740.16 502.80 lo 740.16 504.72 lo 585.84 504.72 lo 585.84 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 504.72 t 740.16 504.72 lo 740.16 506.88 lo 585.84 506.88 lo 585.84 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 506.88 t 740.16 506.88 lo 740.16 509.04 lo 585.84 509.04 lo 585.84 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 509.04 t 740.16 509.04 lo 740.16 510.96 lo 585.84 510.96 lo 585.84 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 510.96 t 740.16 510.96 lo 740.16 513.12 lo 585.84 513.12 lo 585.84 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 513.12 t 740.16 513.12 lo 740.16 515.04 lo 585.84 515.04 lo 585.84 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 659.52 497.04 t 659.52 513.12 lo 666.96 513.12 lo 666.96 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<33> 659.52 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 46.80 t 107.04 80.88 lo 741.84 80.88 lo 741.84 46.80 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica-BoldOblique fcd /Helvetica-BoldOblique-ISO8859-1 fdf}if +/Helvetica-BoldOblique-ISO8859-1 ff [28.08 0 0 -28.08 0 0] mf sf +<5457454220476174657761792d537769746368696e6720696e205072696e6369706c652049> 159.12 73.92 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 273.36 293.76 t 273.36 296.64 lo 721.20 295.92 lo 721.20 293.04 lo 273.36 293.76 lo 273.36 293.76 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 110.88 255.60 t 110.88 277.92 lo 158.40 277.92 lo 158.40 255.60 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica fcd /Helvetica-ISO8859-1 fdf}if +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4f72672041> 110.88 273.60 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 112.32 318.24 t 112.32 340.56 lo 159.84 340.56 lo 159.84 318.24 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4f72672042> 112.32 336.24 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 437.28 187.92 t 518.40 187.92 lo 518.40 235.44 lo 437.28 235.44 lo 437.28 187.92 lo 437.28 187.92 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 435.84 186.48 t 438.72 189.36 lo 516.96 189.36 lo 519.84 186.48 lo 435.84 186.48 lo 435.84 186.48 lo eofill st gr +gs np 519.84 186.48 t 516.96 189.36 lo 516.96 234.00 lo 519.84 236.88 lo 519.84 186.48 lo 519.84 186.48 lo eofill st gr +gs np 519.84 236.88 t 516.96 234.00 lo 438.72 234.00 lo 435.84 236.88 lo 519.84 236.88 lo 519.84 236.88 lo eofill st gr +gs np 435.84 236.88 t 438.72 234.00 lo 438.72 189.36 lo 435.84 186.48 lo 435.84 236.88 lo 435.84 236.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 447.84 200.88 t 447.84 222.96 lo 508.32 222.96 lo 508.32 200.88 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4c44415044> 447.84 218.88 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 439.44 368.88 t 520.56 368.88 lo 520.56 416.40 lo 439.44 416.40 lo 439.44 368.88 lo 439.44 368.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 438.00 367.44 t 440.88 370.32 lo 519.12 370.32 lo 522.00 367.44 lo 438.00 367.44 lo 438.00 367.44 lo eofill st gr +gs np 522.00 367.44 t 519.12 370.32 lo 519.12 414.96 lo 522.00 417.84 lo 522.00 367.44 lo 522.00 367.44 lo eofill st gr +gs np 522.00 417.84 t 519.12 414.96 lo 440.88 414.96 lo 438.00 417.84 lo 522.00 417.84 lo 522.00 417.84 lo eofill st gr +gs np 438.00 417.84 t 440.88 414.96 lo 440.88 370.32 lo 438.00 367.44 lo 438.00 417.84 lo 438.00 417.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 450.00 381.84 t 450.00 403.92 lo 510.48 403.92 lo 510.48 381.84 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4c44415044> 450.00 399.84 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 651.12 256.32 t 644.16 256.08 lo 637.44 255.36 lo 630.96 254.16 lo 624.96 252.72 lo 618.96 250.56 lo 613.68 248.16 lo 608.64 245.52 lo 604.08 242.40 lo 600.00 239.04 lo 596.40 235.44 lo 593.28 231.36 lo 590.88 227.28 lo 589.20 222.96 lo 588.00 218.64 lo 587.76 213.84 lo 588.00 209.28 lo 589.20 204.72 lo 590.88 200.40 lo 593.28 196.32 lo 596.40 192.48 lo 600.00 188.88 lo 604.08 185.52 lo 608.64 182.40 lo 613.68 179.76 lo 618.96 177.36 lo 624.96 175.20 lo 630.96 173.52 lo 637.44 172.32 lo 644.16 171.60 lo 651.12 171.36 lo 657.84 171.60 lo 664.56 172.32 lo 671.04 173.52 lo 677.28 175.20 lo 683.04 177.36 lo 688.32 179.76 lo 693.36 182.40 lo 697.92 185.52 lo 702.24 188.88 lo 705.60 192.48 lo 708.72 196.32 lo 711.12 200.40 lo 712.80 204.72 lo 714.00 209.28 lo 714.48 213.84 lo 714.00 218.64 lo 712.80 222.96 lo 711.12 227.28 lo 708.72 231.36 lo 705.60 235.44 lo 702.24 239.04 lo 697.92 242.40 lo 693.36 245.52 lo 688.32 248.16 lo 683.04 250.56 lo 677.28 252.72 lo 671.04 254.16 lo 664.56 255.36 lo 657.84 256.08 lo 651.12 256.32 lo 651.12 256.32 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 651.12 257.76 t 651.12 254.88 lo 644.16 254.64 lo 643.92 257.52 lo 651.12 257.76 lo 651.12 257.76 lo eofill st gr +gs np 643.92 257.52 t 644.16 254.64 lo 637.68 253.92 lo 637.20 256.80 lo 643.92 257.52 lo 643.92 257.52 lo eofill st gr +gs np 637.20 256.80 t 637.68 253.92 lo 631.44 252.72 lo 630.72 255.60 lo 637.20 256.80 lo 637.20 256.80 lo eofill st gr +gs np 630.72 255.60 t 631.44 252.72 lo 625.20 251.28 lo 624.48 253.92 lo 630.72 255.60 lo 630.72 255.60 lo eofill st gr +gs np 624.48 253.92 t 625.20 251.28 lo 619.68 249.36 lo 618.48 252.00 lo 624.48 253.92 lo 624.48 253.92 lo eofill st gr +gs np 618.48 252.00 t 619.68 249.36 lo 614.40 246.96 lo 612.96 249.36 lo 618.48 252.00 lo 618.48 252.00 lo eofill st gr +gs np 612.96 249.36 t 614.40 246.96 lo 609.36 244.32 lo 607.92 246.72 lo 612.96 249.36 lo 612.96 249.36 lo eofill st gr +gs np 607.92 246.72 t 609.36 244.32 lo 604.80 241.20 lo 603.12 243.60 lo 607.92 246.72 lo 607.92 246.72 lo eofill st gr +gs np 603.12 243.60 t 604.80 241.20 lo 600.96 237.84 lo 599.04 240.00 lo 603.12 243.60 lo 603.12 243.60 lo eofill st gr +gs np 599.04 240.00 t 600.96 237.84 lo 597.36 234.48 lo 595.20 236.40 lo 599.04 240.00 lo 599.04 240.00 lo eofill st gr +gs np 595.20 236.40 t 597.36 234.48 lo 594.48 230.64 lo 592.08 232.32 lo 595.20 236.40 lo 595.20 236.40 lo eofill st gr +gs np 592.08 232.32 t 594.48 230.64 lo 592.08 226.56 lo 589.68 228.00 lo 592.08 232.32 lo 592.08 232.32 lo eofill st gr +gs np 589.68 228.00 t 592.08 226.56 lo 590.40 222.72 lo 587.76 223.44 lo 589.68 228.00 lo 589.68 228.00 lo eofill st gr +gs np 587.76 223.44 t 590.40 222.72 lo 589.44 218.40 lo 586.56 218.64 lo 587.76 223.44 lo 587.76 223.44 lo eofill st gr +gs np 586.56 218.64 t 589.44 218.40 lo 589.20 213.84 lo 586.32 213.84 lo 586.56 218.64 lo 586.56 218.64 lo eofill st gr +gs np 586.32 213.84 t 589.20 213.84 lo 589.44 209.52 lo 586.56 209.04 lo 586.32 213.84 lo 586.32 213.84 lo eofill st gr +gs np 586.56 209.04 t 589.44 209.52 lo 590.40 205.20 lo 587.76 204.48 lo 586.56 209.04 lo 586.56 209.04 lo eofill st gr +gs np 587.76 204.48 t 590.40 205.20 lo 592.32 201.12 lo 589.68 199.92 lo 587.76 204.48 lo 587.76 204.48 lo eofill st gr +gs np 589.68 199.92 t 592.32 201.12 lo 594.48 197.28 lo 592.08 195.60 lo 589.68 199.92 lo 589.68 199.92 lo eofill st gr +gs np 592.08 195.60 t 594.48 197.28 lo 597.36 193.44 lo 595.20 191.52 lo 592.08 195.60 lo 592.08 195.60 lo eofill st gr +gs np 595.20 191.52 t 597.36 193.44 lo 600.96 189.84 lo 599.04 187.68 lo 595.20 191.52 lo 595.20 191.52 lo eofill st gr +gs np 599.04 187.68 t 600.96 189.84 lo 604.80 186.72 lo 603.12 184.32 lo 599.04 187.68 lo 599.04 187.68 lo eofill st gr +gs np 603.12 184.32 t 604.80 186.72 lo 609.36 183.60 lo 607.92 181.20 lo 603.12 184.32 lo 603.12 184.32 lo eofill st gr +gs np 607.92 181.20 t 609.36 183.60 lo 614.16 180.96 lo 612.96 178.32 lo 607.92 181.20 lo 607.92 181.20 lo eofill st gr +gs np 612.96 178.32 t 614.16 180.96 lo 619.68 178.56 lo 618.48 175.92 lo 612.96 178.32 lo 612.96 178.32 lo eofill st gr +gs np 618.48 175.92 t 619.68 178.56 lo 625.20 176.64 lo 624.48 173.76 lo 618.48 175.92 lo 618.48 175.92 lo eofill st gr +gs np 624.48 173.76 t 625.20 176.64 lo 631.44 174.96 lo 630.72 172.32 lo 624.48 173.76 lo 624.48 173.76 lo eofill st gr +gs np 630.72 172.32 t 631.44 174.96 lo 637.68 173.76 lo 637.20 171.12 lo 630.72 172.32 lo 630.72 172.32 lo eofill st gr +gs np 637.20 171.12 t 637.68 173.76 lo 644.16 173.04 lo 644.16 170.40 lo 637.20 171.12 lo 637.20 171.12 lo eofill st gr +gs np 644.16 170.40 t 644.16 173.04 lo 651.12 172.80 lo 651.12 170.16 lo 644.16 170.40 lo 644.16 170.40 lo eofill st gr +gs np 651.12 170.16 t 651.12 172.80 lo 657.84 173.04 lo 658.08 170.16 lo 651.12 170.16 lo 651.12 170.16 lo eofill st gr +gs np 658.08 170.16 t 657.84 173.04 lo 664.32 173.76 lo 664.80 171.12 lo 658.08 170.16 lo 658.08 170.16 lo eofill st gr +gs np 664.80 171.12 t 664.32 173.76 lo 670.80 174.96 lo 671.28 172.32 lo 664.80 171.12 lo 664.80 171.12 lo eofill st gr +gs np 671.28 172.32 t 670.80 174.96 lo 676.80 176.64 lo 677.52 174.00 lo 671.28 172.32 lo 671.28 172.32 lo eofill st gr +gs np 677.52 174.00 t 676.80 176.64 lo 682.56 178.56 lo 683.52 175.92 lo 677.52 174.00 lo 677.52 174.00 lo eofill st gr +gs np 683.52 175.92 t 682.56 178.56 lo 687.84 180.96 lo 689.04 178.32 lo 683.52 175.92 lo 683.52 175.92 lo eofill st gr +gs np 689.04 178.32 t 687.84 180.96 lo 692.64 183.60 lo 694.08 181.20 lo 689.04 178.32 lo 689.04 178.32 lo eofill st gr +gs np 694.08 181.20 t 692.64 183.60 lo 697.20 186.72 lo 698.88 184.32 lo 694.08 181.20 lo 694.08 181.20 lo eofill st gr +gs np 698.88 184.32 t 697.20 186.72 lo 701.28 189.84 lo 703.20 187.92 lo 698.88 184.32 lo 698.88 184.32 lo eofill st gr +gs np 703.20 187.92 t 701.28 189.84 lo 704.64 193.44 lo 706.80 191.52 lo 703.20 187.92 lo 703.20 187.92 lo eofill st gr +gs np 706.80 191.52 t 704.64 193.44 lo 707.52 197.28 lo 709.92 195.60 lo 706.80 191.52 lo 706.80 191.52 lo eofill st gr +gs np 709.92 195.60 t 707.52 197.28 lo 709.92 201.12 lo 712.32 199.92 lo 709.92 195.60 lo 709.92 195.60 lo eofill st gr +gs np 712.32 199.92 t 709.92 201.12 lo 711.60 205.20 lo 714.24 204.48 lo 712.32 199.92 lo 712.32 199.92 lo eofill st gr +gs np 714.24 204.48 t 711.60 205.20 lo 712.56 209.52 lo 715.44 209.04 lo 714.24 204.48 lo 714.24 204.48 lo eofill st gr +gs np 715.44 209.04 t 712.56 209.52 lo 713.04 213.84 lo 715.92 214.08 lo 715.44 209.04 lo 715.44 209.04 lo eofill st gr +gs np 715.92 214.08 t 713.04 213.84 lo 712.56 218.40 lo 715.44 218.88 lo 715.92 214.08 lo 715.92 214.08 lo eofill st gr +gs np 715.44 218.88 t 712.56 218.40 lo 711.60 222.48 lo 714.24 223.44 lo 715.44 218.88 lo 715.44 218.88 lo eofill st gr +gs np 714.24 223.44 t 711.60 222.48 lo 709.92 226.80 lo 712.32 228.00 lo 714.24 223.44 lo 714.24 223.44 lo eofill st gr +gs np 712.32 228.00 t 709.92 226.80 lo 707.52 230.64 lo 709.92 232.32 lo 712.32 228.00 lo 712.32 228.00 lo eofill st gr +gs np 709.92 232.32 t 707.52 230.64 lo 704.64 234.48 lo 706.80 236.16 lo 709.92 232.32 lo 709.92 232.32 lo eofill st gr +gs np 706.80 236.16 t 704.64 234.48 lo 701.28 237.84 lo 703.20 240.00 lo 706.80 236.16 lo 706.80 236.16 lo eofill st gr +gs np 703.20 240.00 t 701.28 237.84 lo 697.20 241.20 lo 698.88 243.60 lo 703.20 240.00 lo 703.20 240.00 lo eofill st gr +gs np 698.88 243.60 t 697.20 241.20 lo 692.64 244.32 lo 694.08 246.72 lo 698.88 243.60 lo 698.88 243.60 lo eofill st gr +gs np 694.08 246.72 t 692.64 244.32 lo 687.84 246.96 lo 689.04 249.36 lo 694.08 246.72 lo 694.08 246.72 lo eofill st gr +gs np 689.04 249.36 t 687.84 246.96 lo 682.56 249.36 lo 683.52 252.00 lo 689.04 249.36 lo 689.04 249.36 lo eofill st gr +gs np 683.52 252.00 t 682.56 249.36 lo 676.80 251.28 lo 677.52 253.92 lo 683.52 252.00 lo 683.52 252.00 lo eofill st gr +gs np 677.52 253.92 t 676.80 251.28 lo 670.80 252.72 lo 671.28 255.60 lo 677.52 253.92 lo 677.52 253.92 lo eofill st gr +gs np 671.28 255.60 t 670.80 252.72 lo 664.32 253.92 lo 664.80 256.80 lo 671.28 255.60 lo 671.28 255.60 lo eofill st gr +gs np 664.80 256.80 t 664.32 253.92 lo 657.84 254.64 lo 658.08 257.52 lo 664.80 256.80 lo 664.80 256.80 lo eofill st gr +gs np 658.08 257.52 t 657.84 254.64 lo 651.12 254.88 lo 651.12 257.76 lo 658.08 257.52 lo 658.08 257.52 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 624.96 203.04 t 624.96 225.36 lo 677.52 225.36 lo 677.52 203.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4453412031> 624.96 221.04 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 650.88 434.40 t 644.16 434.16 lo 637.44 433.44 lo 630.96 432.24 lo 624.72 430.56 lo 618.96 428.64 lo 613.68 426.24 lo 608.64 423.36 lo 604.08 420.24 lo 599.76 416.88 lo 596.40 413.28 lo 593.28 409.44 lo 590.88 405.36 lo 589.20 401.04 lo 588.00 396.48 lo 587.76 391.92 lo 588.00 387.36 lo 589.20 382.80 lo 590.88 378.48 lo 593.28 374.40 lo 596.40 370.56 lo 599.76 366.72 lo 604.08 363.36 lo 608.64 360.48 lo 613.68 357.60 lo 618.96 355.20 lo 624.72 353.28 lo 630.96 351.60 lo 637.44 350.40 lo 644.16 349.68 lo 650.88 349.44 lo 657.84 349.68 lo 664.56 350.40 lo 671.04 351.60 lo 677.04 353.28 lo 683.04 355.20 lo 688.32 357.60 lo 693.36 360.48 lo 697.92 363.36 lo 702.00 366.72 lo 705.60 370.56 lo 708.72 374.40 lo 711.12 378.48 lo 712.80 382.80 lo 714.00 387.36 lo 714.24 391.92 lo 714.00 396.48 lo 712.80 401.04 lo 711.12 405.36 lo 708.72 409.44 lo 705.60 413.28 lo 702.00 416.88 lo 697.92 420.24 lo 693.36 423.36 lo 688.32 426.24 lo 683.04 428.64 lo 677.04 430.56 lo 671.04 432.24 lo 664.56 433.44 lo 657.84 434.16 lo 650.88 434.40 lo 650.88 434.40 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 650.88 435.84 t 650.88 432.96 lo 644.16 432.72 lo 643.92 435.60 lo 650.88 435.84 lo 650.88 435.84 lo eofill st gr +gs np 643.92 435.60 t 644.16 432.72 lo 637.68 432.00 lo 637.20 434.88 lo 643.92 435.60 lo 643.92 435.60 lo eofill st gr +gs np 637.20 434.88 t 637.68 432.00 lo 631.20 430.80 lo 630.72 433.68 lo 637.20 434.88 lo 637.20 434.88 lo eofill st gr +gs np 630.72 433.68 t 631.20 430.80 lo 625.20 429.12 lo 624.48 432.00 lo 630.72 433.68 lo 630.72 433.68 lo eofill st gr +gs np 624.48 432.00 t 625.20 429.12 lo 619.44 427.20 lo 618.48 429.84 lo 624.48 432.00 lo 624.48 432.00 lo eofill st gr +gs np 618.48 429.84 t 619.44 427.20 lo 614.16 424.80 lo 612.96 427.44 lo 618.48 429.84 lo 618.48 429.84 lo eofill st gr +gs np 612.96 427.44 t 614.16 424.80 lo 609.36 422.16 lo 607.92 424.56 lo 612.96 427.44 lo 612.96 427.44 lo eofill st gr +gs np 607.92 424.56 t 609.36 422.16 lo 604.80 419.28 lo 603.12 421.44 lo 607.92 424.56 lo 607.92 424.56 lo eofill st gr +gs np 603.12 421.44 t 604.80 419.28 lo 600.72 415.92 lo 598.80 418.08 lo 603.12 421.44 lo 603.12 421.44 lo eofill st gr +gs np 598.80 418.08 t 600.72 415.92 lo 597.36 412.32 lo 595.20 414.24 lo 598.80 418.08 lo 598.80 418.08 lo eofill st gr +gs np 595.20 414.24 t 597.36 412.32 lo 594.48 408.72 lo 592.08 410.16 lo 595.20 414.24 lo 595.20 414.24 lo eofill st gr +gs np 592.08 410.16 t 594.48 408.72 lo 592.08 404.64 lo 589.68 405.84 lo 592.08 410.16 lo 592.08 410.16 lo eofill st gr +gs np 589.68 405.84 t 592.08 404.64 lo 590.40 400.56 lo 587.76 401.52 lo 589.68 405.84 lo 589.68 405.84 lo eofill st gr +gs np 587.76 401.52 t 590.40 400.56 lo 589.44 396.24 lo 586.56 396.72 lo 587.76 401.52 lo 587.76 401.52 lo eofill st gr +gs np 586.56 396.72 t 589.44 396.24 lo 588.96 391.92 lo 586.32 391.92 lo 586.56 396.72 lo 586.56 396.72 lo eofill st gr +gs np 586.32 391.92 t 588.96 391.92 lo 589.44 387.60 lo 586.56 387.12 lo 586.32 391.92 lo 586.32 391.92 lo eofill st gr +gs np 586.56 387.12 t 589.44 387.60 lo 590.40 383.28 lo 587.76 382.32 lo 586.56 387.12 lo 586.56 387.12 lo eofill st gr +gs np 587.76 382.32 t 590.40 383.28 lo 592.08 379.20 lo 589.68 377.76 lo 587.76 382.32 lo 587.76 382.32 lo eofill st gr +gs np 589.68 377.76 t 592.08 379.20 lo 594.48 375.12 lo 592.08 373.68 lo 589.68 377.76 lo 589.68 377.76 lo eofill st gr +gs np 592.08 373.68 t 594.48 375.12 lo 597.36 371.52 lo 595.20 369.60 lo 592.08 373.68 lo 592.08 373.68 lo eofill st gr +gs np 595.20 369.60 t 597.36 371.52 lo 600.72 367.92 lo 598.80 365.76 lo 595.20 369.60 lo 595.20 369.60 lo eofill st gr +gs np 598.80 365.76 t 600.72 367.92 lo 604.80 364.56 lo 603.12 362.40 lo 598.80 365.76 lo 598.80 365.76 lo eofill st gr +gs np 603.12 362.40 t 604.80 364.56 lo 609.36 361.68 lo 607.92 359.28 lo 603.12 362.40 lo 603.12 362.40 lo eofill st gr +gs np 607.92 359.28 t 609.36 361.68 lo 614.16 359.04 lo 612.96 356.40 lo 607.92 359.28 lo 607.92 359.28 lo eofill st gr +gs np 612.96 356.40 t 614.16 359.04 lo 619.44 356.64 lo 618.48 354.00 lo 612.96 356.40 lo 612.96 356.40 lo eofill st gr +gs np 618.48 354.00 t 619.44 356.64 lo 625.20 354.48 lo 624.48 351.84 lo 618.48 354.00 lo 618.48 354.00 lo eofill st gr +gs np 624.48 351.84 t 625.20 354.48 lo 631.20 353.04 lo 630.72 350.16 lo 624.48 351.84 lo 624.48 351.84 lo eofill st gr +gs np 630.72 350.16 t 631.20 353.04 lo 637.68 351.84 lo 637.20 348.96 lo 630.72 350.16 lo 630.72 350.16 lo eofill st gr +gs np 637.20 348.96 t 637.68 351.84 lo 644.16 351.12 lo 643.92 348.24 lo 637.20 348.96 lo 637.20 348.96 lo eofill st gr +gs np 643.92 348.24 t 644.16 351.12 lo 650.88 350.88 lo 651.12 348.00 lo 643.92 348.24 lo 643.92 348.24 lo eofill st gr +gs np 651.12 348.00 t 650.88 350.88 lo 657.84 351.12 lo 657.84 348.24 lo 651.12 348.00 lo 651.12 348.00 lo eofill st gr +gs np 657.84 348.24 t 657.84 351.12 lo 664.32 351.84 lo 664.80 348.96 lo 657.84 348.24 lo 657.84 348.24 lo eofill st gr +gs np 664.80 348.96 t 664.32 351.84 lo 670.56 353.04 lo 671.28 350.16 lo 664.80 348.96 lo 664.80 348.96 lo eofill st gr +gs np 671.28 350.16 t 670.56 353.04 lo 676.80 354.48 lo 677.52 351.84 lo 671.28 350.16 lo 671.28 350.16 lo eofill st gr +gs np 677.52 351.84 t 676.80 354.48 lo 682.32 356.64 lo 683.52 354.00 lo 677.52 351.84 lo 677.52 351.84 lo eofill st gr +gs np 683.52 354.00 t 682.32 356.64 lo 687.60 359.04 lo 689.04 356.40 lo 683.52 354.00 lo 683.52 354.00 lo eofill st gr +gs np 689.04 356.40 t 687.60 359.04 lo 692.64 361.68 lo 694.08 359.04 lo 689.04 356.40 lo 689.04 356.40 lo eofill st gr +gs np 694.08 359.04 t 692.64 361.68 lo 697.20 364.56 lo 698.88 362.40 lo 694.08 359.04 lo 694.08 359.04 lo eofill st gr +gs np 698.88 362.40 t 697.20 364.56 lo 701.04 367.92 lo 702.96 365.76 lo 698.88 362.40 lo 698.88 362.40 lo eofill st gr +gs np 702.96 365.76 t 701.04 367.92 lo 704.64 371.52 lo 706.80 369.60 lo 702.96 365.76 lo 702.96 365.76 lo eofill st gr +gs np 706.80 369.60 t 704.64 371.52 lo 707.52 375.12 lo 709.92 373.68 lo 706.80 369.60 lo 706.80 369.60 lo eofill st gr +gs np 709.92 373.68 t 707.52 375.12 lo 709.92 379.20 lo 712.32 377.76 lo 709.92 373.68 lo 709.92 373.68 lo eofill st gr +gs np 712.32 377.76 t 709.92 379.20 lo 711.36 383.28 lo 714.24 382.32 lo 712.32 377.76 lo 712.32 377.76 lo eofill st gr +gs np 714.24 382.32 t 711.36 383.28 lo 712.56 387.60 lo 715.20 387.12 lo 714.24 382.32 lo 714.24 382.32 lo eofill st gr +gs np 715.20 387.12 t 712.56 387.60 lo 712.80 391.92 lo 715.68 391.92 lo 715.20 387.12 lo 715.20 387.12 lo eofill st gr +gs np 715.68 391.92 t 712.80 391.92 lo 712.56 396.24 lo 715.44 396.72 lo 715.68 391.92 lo 715.68 391.92 lo eofill st gr +gs np 715.44 396.72 t 712.56 396.24 lo 711.36 400.56 lo 714.24 401.52 lo 715.44 396.72 lo 715.44 396.72 lo eofill st gr +gs np 714.24 401.52 t 711.36 400.56 lo 709.68 404.64 lo 712.32 405.84 lo 714.24 401.52 lo 714.24 401.52 lo eofill st gr +gs np 712.32 405.84 t 709.68 404.64 lo 707.52 408.72 lo 709.92 410.16 lo 712.32 405.84 lo 712.32 405.84 lo eofill st gr +gs np 709.92 410.16 t 707.52 408.72 lo 704.64 412.32 lo 706.80 414.24 lo 709.92 410.16 lo 709.92 410.16 lo eofill st gr +gs np 706.80 414.24 t 704.64 412.32 lo 701.04 415.92 lo 702.96 418.08 lo 706.80 414.24 lo 706.80 414.24 lo eofill st gr +gs np 702.96 418.08 t 701.04 415.92 lo 697.20 419.28 lo 698.88 421.44 lo 702.96 418.08 lo 702.96 418.08 lo eofill st gr +gs np 698.88 421.44 t 697.20 419.28 lo 692.64 422.16 lo 694.08 424.56 lo 698.88 421.44 lo 698.88 421.44 lo eofill st gr +gs np 694.08 424.56 t 692.64 422.16 lo 687.84 424.80 lo 689.04 427.44 lo 694.08 424.56 lo 694.08 424.56 lo eofill st gr +gs np 689.04 427.44 t 687.84 424.80 lo 682.32 427.20 lo 683.52 429.84 lo 689.04 427.44 lo 689.04 427.44 lo eofill st gr +gs np 683.52 429.84 t 682.32 427.20 lo 676.80 429.12 lo 677.52 432.00 lo 683.52 429.84 lo 683.52 429.84 lo eofill st gr +gs np 677.52 432.00 t 676.80 429.12 lo 670.56 430.80 lo 671.28 433.44 lo 677.52 432.00 lo 677.52 432.00 lo eofill st gr +gs np 671.28 433.44 t 670.56 430.80 lo 664.32 432.00 lo 664.80 434.88 lo 671.28 433.44 lo 671.28 433.44 lo eofill st gr +gs np 664.80 434.88 t 664.32 432.00 lo 657.84 432.72 lo 657.84 435.60 lo 664.80 434.88 lo 664.80 434.88 lo eofill st gr +gs np 657.84 435.60 t 657.84 432.72 lo 650.88 432.96 lo 650.88 435.84 lo 657.84 435.60 lo 657.84 435.60 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 624.96 381.12 t 624.96 403.20 lo 677.52 403.20 lo 677.52 381.12 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4453412032> 624.96 399.12 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 280.08 185.52 t 363.36 185.52 lo 363.36 236.40 lo 280.08 236.40 lo 280.08 185.52 lo 280.08 185.52 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 278.64 184.32 t 281.52 186.96 lo 362.16 186.96 lo 364.80 184.32 lo 278.64 184.32 lo 278.64 184.32 lo eofill st gr +gs np 364.80 184.32 t 362.16 186.96 lo 362.16 234.96 lo 364.80 237.60 lo 364.80 184.32 lo 364.80 184.32 lo eofill st gr +gs np 364.80 237.60 t 362.16 234.96 lo 281.52 234.96 lo 278.64 237.60 lo 364.80 237.60 lo 364.80 237.60 lo eofill st gr +gs np 278.64 237.60 t 281.52 234.96 lo 281.52 186.96 lo 278.64 184.32 lo 278.64 237.60 lo 278.64 237.60 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 287.28 200.16 t 287.28 222.24 lo 356.64 222.24 lo 356.64 200.16 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<545745422041> 287.28 218.16 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 540.24 210.24 t 540.24 213.12 lo 569.76 213.12 lo 569.76 210.24 lo 540.24 210.24 lo 540.24 210.24 lo eofill st gr +gs np 529.68 211.68 t 542.40 216.00 lo 542.40 207.36 lo 529.68 211.68 lo eofill st gr +gs np 580.32 211.68 t 567.60 207.36 lo 567.60 216.00 lo 580.32 211.68 lo eofill st gr +gs np 384.00 208.56 t 384.00 211.20 lo 413.76 211.20 lo 413.76 208.56 lo 384.00 208.56 lo 384.00 208.56 lo eofill st gr +gs np 373.44 209.76 t 386.40 214.08 lo 386.40 205.68 lo 373.44 209.76 lo eofill st gr +gs np 424.32 209.76 t 411.36 205.68 lo 411.36 214.08 lo 424.32 209.76 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 112.32 365.04 t 198.72 365.04 lo 198.72 418.80 lo 112.32 418.80 lo 112.32 365.04 lo 112.32 365.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 110.88 363.84 t 113.76 366.48 lo 197.52 366.48 lo 200.16 363.84 lo 110.88 363.84 lo 110.88 363.84 lo eofill st gr +gs np 200.16 363.84 t 197.52 366.48 lo 197.52 417.36 lo 200.16 420.24 lo 200.16 363.84 lo 200.16 363.84 lo eofill st gr +gs np 200.16 420.24 t 197.52 417.36 lo 113.76 417.36 lo 110.88 420.24 lo 200.16 420.24 lo 200.16 420.24 lo eofill st gr +gs np 110.88 420.24 t 113.76 417.36 lo 113.76 366.48 lo 110.88 363.84 lo 110.88 420.24 lo 110.88 420.24 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 122.40 381.12 t 122.40 403.44 lo 189.12 403.44 lo 189.12 381.12 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<42726f77736572> 122.40 399.12 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 276.96 366.72 t 360.48 366.72 lo 360.48 417.36 lo 276.96 417.36 lo 276.96 366.72 lo 276.96 366.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 275.52 365.28 t 278.40 368.16 lo 359.04 368.16 lo 361.92 365.28 lo 275.52 365.28 lo 275.52 365.28 lo eofill st gr +gs np 361.92 365.28 t 359.04 368.16 lo 359.04 415.92 lo 361.92 418.80 lo 361.92 365.28 lo 361.92 365.28 lo eofill st gr +gs np 361.92 418.80 t 359.04 415.92 lo 278.40 415.92 lo 275.52 418.80 lo 361.92 418.80 lo 361.92 418.80 lo eofill st gr +gs np 275.52 418.80 t 278.40 415.92 lo 278.40 368.16 lo 275.52 365.28 lo 275.52 418.80 lo 275.52 418.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 284.16 381.12 t 284.16 403.20 lo 353.76 403.20 lo 353.76 381.12 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<545745422042> 284.16 399.12 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 215.52 339.12 t 217.92 340.80 lo 269.28 264.48 lo 266.88 262.80 lo 215.52 339.12 lo 215.52 339.12 lo eofill st gr +gs np 210.72 348.72 t 221.52 340.56 lo 214.32 335.76 lo 210.72 348.72 lo eofill st gr +gs np 274.08 254.88 t 263.28 263.04 lo 270.48 267.84 lo 274.08 254.88 lo eofill st gr +gs np 129.84 292.56 t 129.84 295.44 lo 226.32 295.92 lo 226.32 293.04 lo 129.84 292.56 lo 129.84 292.56 lo eofill st gr +gr +%%PageTrailer +rs +%%BoundingBox: 18 18 555 759 +showpage +%%BeginSetup +%%BeginFeature: *PageRegion A4 + a4 +%%EndFeature +%%EndSetup +%%Page: 4 4 +%%BeginPageSetup +/#copies 1 def +sv +90 rotate +1.00 -1.00 sl +18.96 18.00 tl +%%EndPageSetup +%%BoundingBox: (atend) +gs +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.72 537.84 t 66.72 25.20 lo 66.72 25.20 lo 66.72 537.84 lo 66.72 537.84 lo eofill st gr +gs np 66.72 537.84 t 66.72 25.20 lo 68.64 25.20 lo 68.64 537.84 lo 66.72 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.122 0.122 0.122 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 68.64 537.84 t 68.64 25.20 lo 70.80 25.20 lo 70.80 537.84 lo 68.64 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.247 0.247 0.247 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 70.80 537.84 t 70.80 25.20 lo 72.96 25.20 lo 72.96 537.84 lo 70.80 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.373 0.373 0.373 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 72.96 537.84 t 72.96 25.20 lo 75.12 25.20 lo 75.12 537.84 lo 72.96 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.498 0.498 0.498 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 75.12 537.84 t 75.12 25.20 lo 77.28 25.20 lo 77.28 537.84 lo 75.12 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.624 0.624 0.624 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 77.28 537.84 t 77.28 25.20 lo 79.44 25.20 lo 79.44 537.84 lo 77.28 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.749 0.749 0.749 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 79.44 537.84 t 79.44 25.20 lo 81.60 25.20 lo 81.60 537.84 lo 79.44 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 98.88 lo 66.96 98.88 lo 66.96 98.88 lo eofill st gr +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 100.80 lo 66.96 100.80 lo 66.96 98.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.110 0.110 0.110 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 100.80 t 741.60 100.80 lo 741.60 102.72 lo 66.96 102.72 lo 66.96 100.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.220 0.220 0.220 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 102.72 t 741.60 102.72 lo 741.60 104.88 lo 66.96 104.88 lo 66.96 102.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.333 0.333 0.333 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 104.88 t 741.60 104.88 lo 741.60 106.80 lo 66.96 106.80 lo 66.96 104.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.443 0.443 0.443 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 106.80 t 741.60 106.80 lo 741.60 108.72 lo 66.96 108.72 lo 66.96 106.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.553 0.553 0.553 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 108.72 t 741.60 108.72 lo 741.60 110.88 lo 66.96 110.88 lo 66.96 108.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.667 0.667 0.667 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 110.88 t 741.60 110.88 lo 741.60 112.80 lo 66.96 112.80 lo 66.96 110.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.776 0.776 0.776 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 112.80 t 741.60 112.80 lo 741.60 114.96 lo 66.96 114.96 lo 66.96 112.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 494.64 lo 94.08 494.64 lo 94.08 494.64 lo eofill st gr +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 496.56 lo 94.08 496.56 lo 94.08 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 496.56 t 395.52 496.56 lo 395.52 498.72 lo 94.08 498.72 lo 94.08 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 498.72 t 395.52 498.72 lo 395.52 500.64 lo 94.08 500.64 lo 94.08 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 500.64 t 395.52 500.64 lo 395.52 502.80 lo 94.08 502.80 lo 94.08 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 502.80 t 395.52 502.80 lo 395.52 504.72 lo 94.08 504.72 lo 94.08 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 504.72 t 395.52 504.72 lo 395.52 506.88 lo 94.08 506.88 lo 94.08 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 506.88 t 395.52 506.88 lo 395.52 509.04 lo 94.08 509.04 lo 94.08 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 509.04 t 395.52 509.04 lo 395.52 510.96 lo 94.08 510.96 lo 94.08 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 510.96 t 395.52 510.96 lo 395.52 513.12 lo 94.08 513.12 lo 94.08 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 513.12 t 395.52 513.12 lo 395.52 515.04 lo 94.08 515.04 lo 94.08 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 130.08 497.04 t 130.08 513.12 lo 360.00 513.12 lo 360.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Times-Roman fcd /Times-Roman-ISO8859-1 fdf}if +/Times-Roman-ISO8859-1 ff [13.68 0 0 -13.68 0 0] mf sf +<4b757274205370616e6965722c205a44562c20556e69766572736974e4742054fc62696e67656e> 130.08 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 494.64 lo 411.60 494.64 lo 411.60 494.64 lo eofill st gr +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 496.56 lo 411.60 496.56 lo 411.60 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 496.56 t 571.92 496.56 lo 571.92 498.72 lo 411.60 498.72 lo 411.60 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 498.72 t 571.92 498.72 lo 571.92 500.64 lo 411.60 500.64 lo 411.60 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 500.64 t 571.92 500.64 lo 571.92 502.80 lo 411.60 502.80 lo 411.60 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 502.80 t 571.92 502.80 lo 571.92 504.72 lo 411.60 504.72 lo 411.60 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 504.72 t 571.92 504.72 lo 571.92 506.88 lo 411.60 506.88 lo 411.60 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 506.88 t 571.92 506.88 lo 571.92 509.04 lo 411.60 509.04 lo 411.60 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 509.04 t 571.92 509.04 lo 571.92 510.96 lo 411.60 510.96 lo 411.60 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 510.96 t 571.92 510.96 lo 571.92 513.12 lo 411.60 513.12 lo 411.60 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 513.12 t 571.92 513.12 lo 571.92 515.04 lo 411.60 515.04 lo 411.60 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 456.00 497.04 t 456.00 513.12 lo 528.00 513.12 lo 528.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<31382d30312d31393939> 456.00 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 494.64 lo 585.84 494.64 lo 585.84 494.64 lo eofill st gr +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 496.56 lo 585.84 496.56 lo 585.84 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 496.56 t 740.16 496.56 lo 740.16 498.72 lo 585.84 498.72 lo 585.84 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 498.72 t 740.16 498.72 lo 740.16 500.64 lo 585.84 500.64 lo 585.84 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 500.64 t 740.16 500.64 lo 740.16 502.80 lo 585.84 502.80 lo 585.84 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 502.80 t 740.16 502.80 lo 740.16 504.72 lo 585.84 504.72 lo 585.84 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 504.72 t 740.16 504.72 lo 740.16 506.88 lo 585.84 506.88 lo 585.84 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 506.88 t 740.16 506.88 lo 740.16 509.04 lo 585.84 509.04 lo 585.84 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 509.04 t 740.16 509.04 lo 740.16 510.96 lo 585.84 510.96 lo 585.84 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 510.96 t 740.16 510.96 lo 740.16 513.12 lo 585.84 513.12 lo 585.84 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 513.12 t 740.16 513.12 lo 740.16 515.04 lo 585.84 515.04 lo 585.84 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 659.52 497.04 t 659.52 513.12 lo 666.96 513.12 lo 666.96 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<34> 659.52 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 46.80 t 107.04 80.88 lo 741.84 80.88 lo 741.84 46.80 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica-BoldOblique fcd /Helvetica-BoldOblique-ISO8859-1 fdf}if +/Helvetica-BoldOblique-ISO8859-1 ff [28.08 0 0 -28.08 0 0] mf sf +<5457454220476174657761792d537769746368696e6720696e205072696e6369706c65204949> 155.28 73.92 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 660.72 293.76 t 660.72 296.64 lo 721.20 295.92 lo 721.20 293.04 lo 660.72 293.76 lo 660.72 293.76 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 110.88 255.60 t 110.88 277.92 lo 158.40 277.92 lo 158.40 255.60 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica fcd /Helvetica-ISO8859-1 fdf}if +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4f72672041> 110.88 273.60 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 112.32 318.24 t 112.32 340.56 lo 159.84 340.56 lo 159.84 318.24 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4f72672042> 112.32 336.24 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 437.28 187.92 t 518.40 187.92 lo 518.40 235.44 lo 437.28 235.44 lo 437.28 187.92 lo 437.28 187.92 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 435.84 186.48 t 438.72 189.36 lo 516.96 189.36 lo 519.84 186.48 lo 435.84 186.48 lo 435.84 186.48 lo eofill st gr +gs np 519.84 186.48 t 516.96 189.36 lo 516.96 234.00 lo 519.84 236.88 lo 519.84 186.48 lo 519.84 186.48 lo eofill st gr +gs np 519.84 236.88 t 516.96 234.00 lo 438.72 234.00 lo 435.84 236.88 lo 519.84 236.88 lo 519.84 236.88 lo eofill st gr +gs np 435.84 236.88 t 438.72 234.00 lo 438.72 189.36 lo 435.84 186.48 lo 435.84 236.88 lo 435.84 236.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 447.84 200.88 t 447.84 222.96 lo 508.32 222.96 lo 508.32 200.88 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4c44415044> 447.84 218.88 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 439.44 368.88 t 520.56 368.88 lo 520.56 416.40 lo 439.44 416.40 lo 439.44 368.88 lo 439.44 368.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 438.00 367.44 t 440.88 370.32 lo 519.12 370.32 lo 522.00 367.44 lo 438.00 367.44 lo 438.00 367.44 lo eofill st gr +gs np 522.00 367.44 t 519.12 370.32 lo 519.12 414.96 lo 522.00 417.84 lo 522.00 367.44 lo 522.00 367.44 lo eofill st gr +gs np 522.00 417.84 t 519.12 414.96 lo 440.88 414.96 lo 438.00 417.84 lo 522.00 417.84 lo 522.00 417.84 lo eofill st gr +gs np 438.00 417.84 t 440.88 414.96 lo 440.88 370.32 lo 438.00 367.44 lo 438.00 417.84 lo 438.00 417.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 450.00 381.84 t 450.00 403.92 lo 510.48 403.92 lo 510.48 381.84 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4c44415044> 450.00 399.84 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 651.12 256.32 t 644.16 256.08 lo 637.44 255.36 lo 630.96 254.16 lo 624.96 252.72 lo 618.96 250.56 lo 613.68 248.16 lo 608.64 245.52 lo 604.08 242.40 lo 600.00 239.04 lo 596.40 235.44 lo 593.28 231.36 lo 590.88 227.28 lo 589.20 222.96 lo 588.00 218.64 lo 587.76 213.84 lo 588.00 209.28 lo 589.20 204.72 lo 590.88 200.40 lo 593.28 196.32 lo 596.40 192.48 lo 600.00 188.88 lo 604.08 185.52 lo 608.64 182.40 lo 613.68 179.76 lo 618.96 177.36 lo 624.96 175.20 lo 630.96 173.52 lo 637.44 172.32 lo 644.16 171.60 lo 651.12 171.36 lo 657.84 171.60 lo 664.56 172.32 lo 671.04 173.52 lo 677.28 175.20 lo 683.04 177.36 lo 688.32 179.76 lo 693.36 182.40 lo 697.92 185.52 lo 702.24 188.88 lo 705.60 192.48 lo 708.72 196.32 lo 711.12 200.40 lo 712.80 204.72 lo 714.00 209.28 lo 714.48 213.84 lo 714.00 218.64 lo 712.80 222.96 lo 711.12 227.28 lo 708.72 231.36 lo 705.60 235.44 lo 702.24 239.04 lo 697.92 242.40 lo 693.36 245.52 lo 688.32 248.16 lo 683.04 250.56 lo 677.28 252.72 lo 671.04 254.16 lo 664.56 255.36 lo 657.84 256.08 lo 651.12 256.32 lo 651.12 256.32 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 651.12 257.76 t 651.12 254.88 lo 644.16 254.64 lo 643.92 257.52 lo 651.12 257.76 lo 651.12 257.76 lo eofill st gr +gs np 643.92 257.52 t 644.16 254.64 lo 637.68 253.92 lo 637.20 256.80 lo 643.92 257.52 lo 643.92 257.52 lo eofill st gr +gs np 637.20 256.80 t 637.68 253.92 lo 631.44 252.72 lo 630.72 255.60 lo 637.20 256.80 lo 637.20 256.80 lo eofill st gr +gs np 630.72 255.60 t 631.44 252.72 lo 625.20 251.28 lo 624.48 253.92 lo 630.72 255.60 lo 630.72 255.60 lo eofill st gr +gs np 624.48 253.92 t 625.20 251.28 lo 619.68 249.36 lo 618.48 252.00 lo 624.48 253.92 lo 624.48 253.92 lo eofill st gr +gs np 618.48 252.00 t 619.68 249.36 lo 614.40 246.96 lo 612.96 249.36 lo 618.48 252.00 lo 618.48 252.00 lo eofill st gr +gs np 612.96 249.36 t 614.40 246.96 lo 609.36 244.32 lo 607.92 246.72 lo 612.96 249.36 lo 612.96 249.36 lo eofill st gr +gs np 607.92 246.72 t 609.36 244.32 lo 604.80 241.20 lo 603.12 243.60 lo 607.92 246.72 lo 607.92 246.72 lo eofill st gr +gs np 603.12 243.60 t 604.80 241.20 lo 600.96 237.84 lo 599.04 240.00 lo 603.12 243.60 lo 603.12 243.60 lo eofill st gr +gs np 599.04 240.00 t 600.96 237.84 lo 597.36 234.48 lo 595.20 236.40 lo 599.04 240.00 lo 599.04 240.00 lo eofill st gr +gs np 595.20 236.40 t 597.36 234.48 lo 594.48 230.64 lo 592.08 232.32 lo 595.20 236.40 lo 595.20 236.40 lo eofill st gr +gs np 592.08 232.32 t 594.48 230.64 lo 592.08 226.56 lo 589.68 228.00 lo 592.08 232.32 lo 592.08 232.32 lo eofill st gr +gs np 589.68 228.00 t 592.08 226.56 lo 590.40 222.72 lo 587.76 223.44 lo 589.68 228.00 lo 589.68 228.00 lo eofill st gr +gs np 587.76 223.44 t 590.40 222.72 lo 589.44 218.40 lo 586.56 218.64 lo 587.76 223.44 lo 587.76 223.44 lo eofill st gr +gs np 586.56 218.64 t 589.44 218.40 lo 589.20 213.84 lo 586.32 213.84 lo 586.56 218.64 lo 586.56 218.64 lo eofill st gr +gs np 586.32 213.84 t 589.20 213.84 lo 589.44 209.52 lo 586.56 209.04 lo 586.32 213.84 lo 586.32 213.84 lo eofill st gr +gs np 586.56 209.04 t 589.44 209.52 lo 590.40 205.20 lo 587.76 204.48 lo 586.56 209.04 lo 586.56 209.04 lo eofill st gr +gs np 587.76 204.48 t 590.40 205.20 lo 592.32 201.12 lo 589.68 199.92 lo 587.76 204.48 lo 587.76 204.48 lo eofill st gr +gs np 589.68 199.92 t 592.32 201.12 lo 594.48 197.28 lo 592.08 195.60 lo 589.68 199.92 lo 589.68 199.92 lo eofill st gr +gs np 592.08 195.60 t 594.48 197.28 lo 597.36 193.44 lo 595.20 191.52 lo 592.08 195.60 lo 592.08 195.60 lo eofill st gr +gs np 595.20 191.52 t 597.36 193.44 lo 600.96 189.84 lo 599.04 187.68 lo 595.20 191.52 lo 595.20 191.52 lo eofill st gr +gs np 599.04 187.68 t 600.96 189.84 lo 604.80 186.72 lo 603.12 184.32 lo 599.04 187.68 lo 599.04 187.68 lo eofill st gr +gs np 603.12 184.32 t 604.80 186.72 lo 609.36 183.60 lo 607.92 181.20 lo 603.12 184.32 lo 603.12 184.32 lo eofill st gr +gs np 607.92 181.20 t 609.36 183.60 lo 614.16 180.96 lo 612.96 178.32 lo 607.92 181.20 lo 607.92 181.20 lo eofill st gr +gs np 612.96 178.32 t 614.16 180.96 lo 619.68 178.56 lo 618.48 175.92 lo 612.96 178.32 lo 612.96 178.32 lo eofill st gr +gs np 618.48 175.92 t 619.68 178.56 lo 625.20 176.64 lo 624.48 173.76 lo 618.48 175.92 lo 618.48 175.92 lo eofill st gr +gs np 624.48 173.76 t 625.20 176.64 lo 631.44 174.96 lo 630.72 172.32 lo 624.48 173.76 lo 624.48 173.76 lo eofill st gr +gs np 630.72 172.32 t 631.44 174.96 lo 637.68 173.76 lo 637.20 171.12 lo 630.72 172.32 lo 630.72 172.32 lo eofill st gr +gs np 637.20 171.12 t 637.68 173.76 lo 644.16 173.04 lo 644.16 170.40 lo 637.20 171.12 lo 637.20 171.12 lo eofill st gr +gs np 644.16 170.40 t 644.16 173.04 lo 651.12 172.80 lo 651.12 170.16 lo 644.16 170.40 lo 644.16 170.40 lo eofill st gr +gs np 651.12 170.16 t 651.12 172.80 lo 657.84 173.04 lo 658.08 170.16 lo 651.12 170.16 lo 651.12 170.16 lo eofill st gr +gs np 658.08 170.16 t 657.84 173.04 lo 664.32 173.76 lo 664.80 171.12 lo 658.08 170.16 lo 658.08 170.16 lo eofill st gr +gs np 664.80 171.12 t 664.32 173.76 lo 670.80 174.96 lo 671.28 172.32 lo 664.80 171.12 lo 664.80 171.12 lo eofill st gr +gs np 671.28 172.32 t 670.80 174.96 lo 676.80 176.64 lo 677.52 174.00 lo 671.28 172.32 lo 671.28 172.32 lo eofill st gr +gs np 677.52 174.00 t 676.80 176.64 lo 682.56 178.56 lo 683.52 175.92 lo 677.52 174.00 lo 677.52 174.00 lo eofill st gr +gs np 683.52 175.92 t 682.56 178.56 lo 687.84 180.96 lo 689.04 178.32 lo 683.52 175.92 lo 683.52 175.92 lo eofill st gr +gs np 689.04 178.32 t 687.84 180.96 lo 692.64 183.60 lo 694.08 181.20 lo 689.04 178.32 lo 689.04 178.32 lo eofill st gr +gs np 694.08 181.20 t 692.64 183.60 lo 697.20 186.72 lo 698.88 184.32 lo 694.08 181.20 lo 694.08 181.20 lo eofill st gr +gs np 698.88 184.32 t 697.20 186.72 lo 701.28 189.84 lo 703.20 187.92 lo 698.88 184.32 lo 698.88 184.32 lo eofill st gr +gs np 703.20 187.92 t 701.28 189.84 lo 704.64 193.44 lo 706.80 191.52 lo 703.20 187.92 lo 703.20 187.92 lo eofill st gr +gs np 706.80 191.52 t 704.64 193.44 lo 707.52 197.28 lo 709.92 195.60 lo 706.80 191.52 lo 706.80 191.52 lo eofill st gr +gs np 709.92 195.60 t 707.52 197.28 lo 709.92 201.12 lo 712.32 199.92 lo 709.92 195.60 lo 709.92 195.60 lo eofill st gr +gs np 712.32 199.92 t 709.92 201.12 lo 711.60 205.20 lo 714.24 204.48 lo 712.32 199.92 lo 712.32 199.92 lo eofill st gr +gs np 714.24 204.48 t 711.60 205.20 lo 712.56 209.52 lo 715.44 209.04 lo 714.24 204.48 lo 714.24 204.48 lo eofill st gr +gs np 715.44 209.04 t 712.56 209.52 lo 713.04 213.84 lo 715.92 214.08 lo 715.44 209.04 lo 715.44 209.04 lo eofill st gr +gs np 715.92 214.08 t 713.04 213.84 lo 712.56 218.40 lo 715.44 218.88 lo 715.92 214.08 lo 715.92 214.08 lo eofill st gr +gs np 715.44 218.88 t 712.56 218.40 lo 711.60 222.48 lo 714.24 223.44 lo 715.44 218.88 lo 715.44 218.88 lo eofill st gr +gs np 714.24 223.44 t 711.60 222.48 lo 709.92 226.80 lo 712.32 228.00 lo 714.24 223.44 lo 714.24 223.44 lo eofill st gr +gs np 712.32 228.00 t 709.92 226.80 lo 707.52 230.64 lo 709.92 232.32 lo 712.32 228.00 lo 712.32 228.00 lo eofill st gr +gs np 709.92 232.32 t 707.52 230.64 lo 704.64 234.48 lo 706.80 236.16 lo 709.92 232.32 lo 709.92 232.32 lo eofill st gr +gs np 706.80 236.16 t 704.64 234.48 lo 701.28 237.84 lo 703.20 240.00 lo 706.80 236.16 lo 706.80 236.16 lo eofill st gr +gs np 703.20 240.00 t 701.28 237.84 lo 697.20 241.20 lo 698.88 243.60 lo 703.20 240.00 lo 703.20 240.00 lo eofill st gr +gs np 698.88 243.60 t 697.20 241.20 lo 692.64 244.32 lo 694.08 246.72 lo 698.88 243.60 lo 698.88 243.60 lo eofill st gr +gs np 694.08 246.72 t 692.64 244.32 lo 687.84 246.96 lo 689.04 249.36 lo 694.08 246.72 lo 694.08 246.72 lo eofill st gr +gs np 689.04 249.36 t 687.84 246.96 lo 682.56 249.36 lo 683.52 252.00 lo 689.04 249.36 lo 689.04 249.36 lo eofill st gr +gs np 683.52 252.00 t 682.56 249.36 lo 676.80 251.28 lo 677.52 253.92 lo 683.52 252.00 lo 683.52 252.00 lo eofill st gr +gs np 677.52 253.92 t 676.80 251.28 lo 670.80 252.72 lo 671.28 255.60 lo 677.52 253.92 lo 677.52 253.92 lo eofill st gr +gs np 671.28 255.60 t 670.80 252.72 lo 664.32 253.92 lo 664.80 256.80 lo 671.28 255.60 lo 671.28 255.60 lo eofill st gr +gs np 664.80 256.80 t 664.32 253.92 lo 657.84 254.64 lo 658.08 257.52 lo 664.80 256.80 lo 664.80 256.80 lo eofill st gr +gs np 658.08 257.52 t 657.84 254.64 lo 651.12 254.88 lo 651.12 257.76 lo 658.08 257.52 lo 658.08 257.52 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 624.96 203.04 t 624.96 225.36 lo 677.52 225.36 lo 677.52 203.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4453412031> 624.96 221.04 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 651.12 435.84 t 644.16 435.60 lo 637.44 434.88 lo 630.96 433.68 lo 624.96 432.00 lo 618.96 430.08 lo 613.68 427.68 lo 608.64 424.80 lo 604.08 421.92 lo 599.76 418.56 lo 596.40 414.72 lo 593.28 410.88 lo 590.88 406.80 lo 589.20 402.48 lo 588.00 397.92 lo 587.76 393.36 lo 588.00 388.80 lo 589.20 384.24 lo 590.88 379.92 lo 593.28 375.84 lo 596.40 372.00 lo 599.76 368.40 lo 604.08 365.04 lo 608.64 361.92 lo 613.68 359.04 lo 618.96 356.64 lo 624.96 354.72 lo 630.96 353.04 lo 637.44 351.84 lo 644.16 351.12 lo 651.12 350.88 lo 657.84 351.12 lo 664.56 351.84 lo 671.04 353.04 lo 677.04 354.72 lo 683.04 356.64 lo 688.32 359.04 lo 693.36 361.92 lo 697.92 365.04 lo 702.24 368.40 lo 705.60 372.00 lo 708.72 375.84 lo 711.12 379.92 lo 712.80 384.24 lo 714.00 388.80 lo 714.24 393.36 lo 714.00 397.92 lo 712.80 402.48 lo 711.12 406.80 lo 708.72 410.88 lo 705.60 414.72 lo 702.24 418.56 lo 697.92 421.92 lo 693.36 424.80 lo 688.32 427.68 lo 683.04 430.08 lo 677.04 432.00 lo 671.04 433.68 lo 664.56 434.88 lo 657.84 435.60 lo 651.12 435.84 lo 651.12 435.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 651.12 437.28 t 651.12 434.40 lo 644.16 434.16 lo 643.92 437.04 lo 651.12 437.28 lo 651.12 437.28 lo eofill st gr +gs np 643.92 437.04 t 644.16 434.16 lo 637.68 433.44 lo 637.20 436.32 lo 643.92 437.04 lo 643.92 437.04 lo eofill st gr +gs np 637.20 436.32 t 637.68 433.44 lo 631.20 432.24 lo 630.72 435.12 lo 637.20 436.32 lo 637.20 436.32 lo eofill st gr +gs np 630.72 435.12 t 631.20 432.24 lo 625.20 430.80 lo 624.48 433.44 lo 630.72 435.12 lo 630.72 435.12 lo eofill st gr +gs np 624.48 433.44 t 625.20 430.80 lo 619.68 428.64 lo 618.48 431.28 lo 624.48 433.44 lo 624.48 433.44 lo eofill st gr +gs np 618.48 431.28 t 619.68 428.64 lo 614.16 426.24 lo 612.96 428.88 lo 618.48 431.28 lo 618.48 431.28 lo eofill st gr +gs np 612.96 428.88 t 614.16 426.24 lo 609.36 423.60 lo 607.92 426.24 lo 612.96 428.88 lo 612.96 428.88 lo eofill st gr +gs np 607.92 426.24 t 609.36 423.60 lo 604.80 420.72 lo 603.12 422.88 lo 607.92 426.24 lo 607.92 426.24 lo eofill st gr +gs np 603.12 422.88 t 604.80 420.72 lo 600.96 417.36 lo 599.04 419.52 lo 603.12 422.88 lo 603.12 422.88 lo eofill st gr +gs np 599.04 419.52 t 600.96 417.36 lo 597.36 413.76 lo 595.20 415.68 lo 599.04 419.52 lo 599.04 419.52 lo eofill st gr +gs np 595.20 415.68 t 597.36 413.76 lo 594.48 410.16 lo 592.08 411.60 lo 595.20 415.68 lo 595.20 415.68 lo eofill st gr +gs np 592.08 411.60 t 594.48 410.16 lo 592.08 406.08 lo 589.68 407.52 lo 592.08 411.60 lo 592.08 411.60 lo eofill st gr +gs np 589.68 407.52 t 592.08 406.08 lo 590.40 402.00 lo 587.76 402.96 lo 589.68 407.52 lo 589.68 407.52 lo eofill st gr +gs np 587.76 402.96 t 590.40 402.00 lo 589.44 397.68 lo 586.56 398.16 lo 587.76 402.96 lo 587.76 402.96 lo eofill st gr +gs np 586.56 398.16 t 589.44 397.68 lo 589.20 393.36 lo 586.32 393.36 lo 586.56 398.16 lo 586.56 398.16 lo eofill st gr +gs np 586.32 393.36 t 589.20 393.36 lo 589.44 389.04 lo 586.56 388.56 lo 586.32 393.36 lo 586.32 393.36 lo eofill st gr +gs np 586.56 388.56 t 589.44 389.04 lo 590.40 384.72 lo 587.76 383.76 lo 586.56 388.56 lo 586.56 388.56 lo eofill st gr +gs np 587.76 383.76 t 590.40 384.72 lo 592.08 380.64 lo 589.68 379.44 lo 587.76 383.76 lo 587.76 383.76 lo eofill st gr +gs np 589.68 379.44 t 592.08 380.64 lo 594.48 376.56 lo 592.08 375.12 lo 589.68 379.44 lo 589.68 379.44 lo eofill st gr +gs np 592.08 375.12 t 594.48 376.56 lo 597.36 372.96 lo 595.20 371.04 lo 592.08 375.12 lo 592.08 375.12 lo eofill st gr +gs np 595.20 371.04 t 597.36 372.96 lo 600.96 369.36 lo 598.80 367.20 lo 595.20 371.04 lo 595.20 371.04 lo eofill st gr +gs np 598.80 367.20 t 600.96 369.36 lo 604.80 366.00 lo 603.12 363.84 lo 598.80 367.20 lo 598.80 367.20 lo eofill st gr +gs np 603.12 363.84 t 604.80 366.00 lo 609.36 363.12 lo 607.92 360.72 lo 603.12 363.84 lo 603.12 363.84 lo eofill st gr +gs np 607.92 360.72 t 609.36 363.12 lo 614.16 360.48 lo 612.96 357.84 lo 607.92 360.72 lo 607.92 360.72 lo eofill st gr +gs np 612.96 357.84 t 614.16 360.48 lo 619.68 358.08 lo 618.48 355.44 lo 612.96 357.84 lo 612.96 357.84 lo eofill st gr +gs np 618.48 355.44 t 619.68 358.08 lo 625.20 356.16 lo 624.48 353.28 lo 618.48 355.44 lo 618.48 355.44 lo eofill st gr +gs np 624.48 353.28 t 625.20 356.16 lo 631.20 354.48 lo 630.72 351.84 lo 624.48 353.28 lo 624.48 353.28 lo eofill st gr +gs np 630.72 351.84 t 631.20 354.48 lo 637.68 353.28 lo 637.20 350.40 lo 630.72 351.84 lo 630.72 351.84 lo eofill st gr +gs np 637.20 350.40 t 637.68 353.28 lo 644.16 352.56 lo 643.92 349.68 lo 637.20 350.40 lo 637.20 350.40 lo eofill st gr +gs np 643.92 349.68 t 644.16 352.56 lo 651.12 352.32 lo 651.12 349.44 lo 643.92 349.68 lo 643.92 349.68 lo eofill st gr +gs np 651.12 349.44 t 651.12 352.32 lo 657.84 352.56 lo 658.08 349.68 lo 651.12 349.44 lo 651.12 349.44 lo eofill st gr +gs np 658.08 349.68 t 657.84 352.56 lo 664.32 353.28 lo 664.80 350.40 lo 658.08 349.68 lo 658.08 349.68 lo eofill st gr +gs np 664.80 350.40 t 664.32 353.28 lo 670.80 354.48 lo 671.28 351.60 lo 664.80 350.40 lo 664.80 350.40 lo eofill st gr +gs np 671.28 351.60 t 670.80 354.48 lo 676.80 356.16 lo 677.52 353.28 lo 671.28 351.60 lo 671.28 351.60 lo eofill st gr +gs np 677.52 353.28 t 676.80 356.16 lo 682.32 358.08 lo 683.52 355.44 lo 677.52 353.28 lo 677.52 353.28 lo eofill st gr +gs np 683.52 355.44 t 682.32 358.08 lo 687.84 360.48 lo 689.04 357.84 lo 683.52 355.44 lo 683.52 355.44 lo eofill st gr +gs np 689.04 357.84 t 687.84 360.48 lo 692.64 363.12 lo 694.08 360.72 lo 689.04 357.84 lo 689.04 357.84 lo eofill st gr +gs np 694.08 360.72 t 692.64 363.12 lo 697.20 366.00 lo 698.88 363.84 lo 694.08 360.72 lo 694.08 360.72 lo eofill st gr +gs np 698.88 363.84 t 697.20 366.00 lo 701.04 369.36 lo 702.96 367.20 lo 698.88 363.84 lo 698.88 363.84 lo eofill st gr +gs np 702.96 367.20 t 701.04 369.36 lo 704.64 372.96 lo 706.80 371.04 lo 702.96 367.20 lo 702.96 367.20 lo eofill st gr +gs np 706.80 371.04 t 704.64 372.96 lo 707.52 376.56 lo 709.92 375.12 lo 706.80 371.04 lo 706.80 371.04 lo eofill st gr +gs np 709.92 375.12 t 707.52 376.56 lo 709.92 380.64 lo 712.32 379.44 lo 709.92 375.12 lo 709.92 375.12 lo eofill st gr +gs np 712.32 379.44 t 709.92 380.64 lo 711.60 384.72 lo 714.24 383.76 lo 712.32 379.44 lo 712.32 379.44 lo eofill st gr +gs np 714.24 383.76 t 711.60 384.72 lo 712.56 389.04 lo 715.44 388.56 lo 714.24 383.76 lo 714.24 383.76 lo eofill st gr +gs np 715.44 388.56 t 712.56 389.04 lo 713.04 393.36 lo 715.68 393.36 lo 715.44 388.56 lo 715.44 388.56 lo eofill st gr +gs np 715.68 393.36 t 713.04 393.36 lo 712.56 397.68 lo 715.44 398.16 lo 715.68 393.36 lo 715.68 393.36 lo eofill st gr +gs np 715.44 398.16 t 712.56 397.68 lo 711.60 402.00 lo 714.24 402.96 lo 715.44 398.16 lo 715.44 398.16 lo eofill st gr +gs np 714.24 402.96 t 711.60 402.00 lo 709.92 406.08 lo 712.32 407.52 lo 714.24 402.96 lo 714.24 402.96 lo eofill st gr +gs np 712.32 407.52 t 709.92 406.08 lo 707.52 410.16 lo 709.92 411.60 lo 712.32 407.52 lo 712.32 407.52 lo eofill st gr +gs np 709.92 411.60 t 707.52 410.16 lo 704.64 413.76 lo 706.80 415.68 lo 709.92 411.60 lo 709.92 411.60 lo eofill st gr +gs np 706.80 415.68 t 704.64 413.76 lo 701.04 417.36 lo 703.20 419.52 lo 706.80 415.68 lo 706.80 415.68 lo eofill st gr +gs np 703.20 419.52 t 701.04 417.36 lo 697.20 420.72 lo 698.88 422.88 lo 703.20 419.52 lo 703.20 419.52 lo eofill st gr +gs np 698.88 422.88 t 697.20 420.72 lo 692.64 423.60 lo 694.08 426.00 lo 698.88 422.88 lo 698.88 422.88 lo eofill st gr +gs np 694.08 426.00 t 692.64 423.60 lo 687.84 426.24 lo 689.04 428.88 lo 694.08 426.00 lo 694.08 426.00 lo eofill st gr +gs np 689.04 428.88 t 687.84 426.24 lo 682.32 428.64 lo 683.52 431.28 lo 689.04 428.88 lo 689.04 428.88 lo eofill st gr +gs np 683.52 431.28 t 682.32 428.64 lo 676.80 430.80 lo 677.52 433.44 lo 683.52 431.28 lo 683.52 431.28 lo eofill st gr +gs np 677.52 433.44 t 676.80 430.80 lo 670.80 432.24 lo 671.28 435.12 lo 677.52 433.44 lo 677.52 433.44 lo eofill st gr +gs np 671.28 435.12 t 670.80 432.24 lo 664.32 433.44 lo 664.80 436.32 lo 671.28 435.12 lo 671.28 435.12 lo eofill st gr +gs np 664.80 436.32 t 664.32 433.44 lo 657.84 434.16 lo 658.08 437.04 lo 664.80 436.32 lo 664.80 436.32 lo eofill st gr +gs np 658.08 437.04 t 657.84 434.16 lo 651.12 434.40 lo 651.12 437.28 lo 658.08 437.04 lo 658.08 437.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 624.96 382.56 t 624.96 404.88 lo 677.52 404.88 lo 677.52 382.56 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4453412032> 624.96 400.56 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 280.08 185.52 t 363.36 185.52 lo 363.36 236.40 lo 280.08 236.40 lo 280.08 185.52 lo 280.08 185.52 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 278.64 184.32 t 281.52 186.96 lo 362.16 186.96 lo 364.80 184.32 lo 278.64 184.32 lo 278.64 184.32 lo eofill st gr +gs np 364.80 184.32 t 362.16 186.96 lo 362.16 234.96 lo 364.80 237.60 lo 364.80 184.32 lo 364.80 184.32 lo eofill st gr +gs np 364.80 237.60 t 362.16 234.96 lo 281.52 234.96 lo 278.64 237.60 lo 364.80 237.60 lo 364.80 237.60 lo eofill st gr +gs np 278.64 237.60 t 281.52 234.96 lo 281.52 186.96 lo 278.64 184.32 lo 278.64 237.60 lo 278.64 237.60 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 287.28 200.16 t 287.28 222.24 lo 356.64 222.24 lo 356.64 200.16 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<545745422041> 287.28 218.16 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 540.24 210.24 t 540.24 213.12 lo 569.76 213.12 lo 569.76 210.24 lo 540.24 210.24 lo 540.24 210.24 lo eofill st gr +gs np 529.68 211.68 t 542.40 216.00 lo 542.40 207.36 lo 529.68 211.68 lo eofill st gr +gs np 580.32 211.68 t 567.60 207.36 lo 567.60 216.00 lo 580.32 211.68 lo eofill st gr +gs np 384.00 208.56 t 384.00 211.20 lo 413.76 211.20 lo 413.76 208.56 lo 384.00 208.56 lo 384.00 208.56 lo eofill st gr +gs np 373.44 209.76 t 386.40 214.08 lo 386.40 205.68 lo 373.44 209.76 lo eofill st gr +gs np 424.32 209.76 t 411.36 205.68 lo 411.36 214.08 lo 424.32 209.76 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 112.32 365.04 t 198.72 365.04 lo 198.72 418.80 lo 112.32 418.80 lo 112.32 365.04 lo 112.32 365.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 110.88 363.84 t 113.76 366.48 lo 197.52 366.48 lo 200.16 363.84 lo 110.88 363.84 lo 110.88 363.84 lo eofill st gr +gs np 200.16 363.84 t 197.52 366.48 lo 197.52 417.36 lo 200.16 420.24 lo 200.16 363.84 lo 200.16 363.84 lo eofill st gr +gs np 200.16 420.24 t 197.52 417.36 lo 113.76 417.36 lo 110.88 420.24 lo 200.16 420.24 lo 200.16 420.24 lo eofill st gr +gs np 110.88 420.24 t 113.76 417.36 lo 113.76 366.48 lo 110.88 363.84 lo 110.88 420.24 lo 110.88 420.24 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 122.40 381.12 t 122.40 403.44 lo 189.12 403.44 lo 189.12 381.12 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<42726f77736572> 122.40 399.12 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 276.96 366.72 t 360.48 366.72 lo 360.48 417.36 lo 276.96 417.36 lo 276.96 366.72 lo 276.96 366.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 275.52 365.28 t 278.40 368.16 lo 359.04 368.16 lo 361.92 365.28 lo 275.52 365.28 lo 275.52 365.28 lo eofill st gr +gs np 361.92 365.28 t 359.04 368.16 lo 359.04 415.92 lo 361.92 418.80 lo 361.92 365.28 lo 361.92 365.28 lo eofill st gr +gs np 361.92 418.80 t 359.04 415.92 lo 278.40 415.92 lo 275.52 418.80 lo 361.92 418.80 lo 361.92 418.80 lo eofill st gr +gs np 275.52 418.80 t 278.40 415.92 lo 278.40 368.16 lo 275.52 365.28 lo 275.52 418.80 lo 275.52 418.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 284.16 381.12 t 284.16 403.20 lo 353.76 403.20 lo 353.76 381.12 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<545745422042> 284.16 399.12 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 215.52 339.12 t 217.92 340.80 lo 269.28 264.48 lo 266.88 262.80 lo 215.52 339.12 lo 215.52 339.12 lo eofill st gr +gs np 210.72 348.72 t 221.52 340.56 lo 214.32 335.76 lo 210.72 348.72 lo eofill st gr +gs np 274.08 254.88 t 263.28 263.04 lo 270.48 267.84 lo 274.08 254.88 lo eofill st gr +gs np 129.84 292.56 t 129.84 295.44 lo 226.32 295.92 lo 226.32 293.04 lo 129.84 292.56 lo 129.84 292.56 lo eofill st gr +gs np 652.56 278.16 t 649.68 278.16 lo 649.68 330.72 lo 652.56 330.72 lo 652.56 278.16 lo 652.56 278.16 lo eofill st gr +gs np 651.12 267.60 t 646.80 280.32 lo 655.20 280.32 lo 651.12 267.60 lo eofill st gr +gs np 651.12 337.68 t 646.80 329.04 lo 655.20 329.04 lo 651.12 337.68 lo 651.12 337.68 lo eofill st gr +gs np 274.56 293.28 t 274.56 296.16 lo 637.68 295.92 lo 637.68 293.04 lo 274.56 293.28 lo 274.56 293.28 lo eofill st gr +gr +%%PageTrailer +rs +%%BoundingBox: 18 18 555 759 +showpage +%%BeginSetup +%%BeginFeature: *PageRegion A4 + a4 +%%EndFeature +%%EndSetup +%%Page: 5 5 +%%BeginPageSetup +/#copies 1 def +sv +90 rotate +1.00 -1.00 sl +18.96 18.00 tl +%%EndPageSetup +%%BoundingBox: (atend) +gs +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.72 537.84 t 66.72 25.20 lo 66.72 25.20 lo 66.72 537.84 lo 66.72 537.84 lo eofill st gr +gs np 66.72 537.84 t 66.72 25.20 lo 68.64 25.20 lo 68.64 537.84 lo 66.72 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.122 0.122 0.122 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 68.64 537.84 t 68.64 25.20 lo 70.80 25.20 lo 70.80 537.84 lo 68.64 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.247 0.247 0.247 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 70.80 537.84 t 70.80 25.20 lo 72.96 25.20 lo 72.96 537.84 lo 70.80 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.373 0.373 0.373 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 72.96 537.84 t 72.96 25.20 lo 75.12 25.20 lo 75.12 537.84 lo 72.96 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.498 0.498 0.498 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 75.12 537.84 t 75.12 25.20 lo 77.28 25.20 lo 77.28 537.84 lo 75.12 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.624 0.624 0.624 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 77.28 537.84 t 77.28 25.20 lo 79.44 25.20 lo 79.44 537.84 lo 77.28 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.749 0.749 0.749 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 79.44 537.84 t 79.44 25.20 lo 81.60 25.20 lo 81.60 537.84 lo 79.44 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 98.88 lo 66.96 98.88 lo 66.96 98.88 lo eofill st gr +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 100.80 lo 66.96 100.80 lo 66.96 98.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.110 0.110 0.110 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 100.80 t 741.60 100.80 lo 741.60 102.72 lo 66.96 102.72 lo 66.96 100.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.220 0.220 0.220 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 102.72 t 741.60 102.72 lo 741.60 104.88 lo 66.96 104.88 lo 66.96 102.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.333 0.333 0.333 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 104.88 t 741.60 104.88 lo 741.60 106.80 lo 66.96 106.80 lo 66.96 104.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.443 0.443 0.443 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 106.80 t 741.60 106.80 lo 741.60 108.72 lo 66.96 108.72 lo 66.96 106.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.553 0.553 0.553 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 108.72 t 741.60 108.72 lo 741.60 110.88 lo 66.96 110.88 lo 66.96 108.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.667 0.667 0.667 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 110.88 t 741.60 110.88 lo 741.60 112.80 lo 66.96 112.80 lo 66.96 110.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.776 0.776 0.776 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 112.80 t 741.60 112.80 lo 741.60 114.96 lo 66.96 114.96 lo 66.96 112.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 494.64 lo 94.08 494.64 lo 94.08 494.64 lo eofill st gr +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 496.56 lo 94.08 496.56 lo 94.08 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 496.56 t 395.52 496.56 lo 395.52 498.72 lo 94.08 498.72 lo 94.08 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 498.72 t 395.52 498.72 lo 395.52 500.64 lo 94.08 500.64 lo 94.08 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 500.64 t 395.52 500.64 lo 395.52 502.80 lo 94.08 502.80 lo 94.08 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 502.80 t 395.52 502.80 lo 395.52 504.72 lo 94.08 504.72 lo 94.08 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 504.72 t 395.52 504.72 lo 395.52 506.88 lo 94.08 506.88 lo 94.08 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 506.88 t 395.52 506.88 lo 395.52 509.04 lo 94.08 509.04 lo 94.08 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 509.04 t 395.52 509.04 lo 395.52 510.96 lo 94.08 510.96 lo 94.08 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 510.96 t 395.52 510.96 lo 395.52 513.12 lo 94.08 513.12 lo 94.08 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 513.12 t 395.52 513.12 lo 395.52 515.04 lo 94.08 515.04 lo 94.08 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 130.08 497.04 t 130.08 513.12 lo 360.00 513.12 lo 360.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Times-Roman fcd /Times-Roman-ISO8859-1 fdf}if +/Times-Roman-ISO8859-1 ff [13.68 0 0 -13.68 0 0] mf sf +<4b757274205370616e6965722c205a44562c20556e69766572736974e4742054fc62696e67656e> 130.08 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 494.64 lo 411.60 494.64 lo 411.60 494.64 lo eofill st gr +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 496.56 lo 411.60 496.56 lo 411.60 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 496.56 t 571.92 496.56 lo 571.92 498.72 lo 411.60 498.72 lo 411.60 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 498.72 t 571.92 498.72 lo 571.92 500.64 lo 411.60 500.64 lo 411.60 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 500.64 t 571.92 500.64 lo 571.92 502.80 lo 411.60 502.80 lo 411.60 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 502.80 t 571.92 502.80 lo 571.92 504.72 lo 411.60 504.72 lo 411.60 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 504.72 t 571.92 504.72 lo 571.92 506.88 lo 411.60 506.88 lo 411.60 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 506.88 t 571.92 506.88 lo 571.92 509.04 lo 411.60 509.04 lo 411.60 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 509.04 t 571.92 509.04 lo 571.92 510.96 lo 411.60 510.96 lo 411.60 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 510.96 t 571.92 510.96 lo 571.92 513.12 lo 411.60 513.12 lo 411.60 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 513.12 t 571.92 513.12 lo 571.92 515.04 lo 411.60 515.04 lo 411.60 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 456.00 497.04 t 456.00 513.12 lo 528.00 513.12 lo 528.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<31382d30312d31393939> 456.00 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 494.64 lo 585.84 494.64 lo 585.84 494.64 lo eofill st gr +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 496.56 lo 585.84 496.56 lo 585.84 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 496.56 t 740.16 496.56 lo 740.16 498.72 lo 585.84 498.72 lo 585.84 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 498.72 t 740.16 498.72 lo 740.16 500.64 lo 585.84 500.64 lo 585.84 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 500.64 t 740.16 500.64 lo 740.16 502.80 lo 585.84 502.80 lo 585.84 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 502.80 t 740.16 502.80 lo 740.16 504.72 lo 585.84 504.72 lo 585.84 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 504.72 t 740.16 504.72 lo 740.16 506.88 lo 585.84 506.88 lo 585.84 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 506.88 t 740.16 506.88 lo 740.16 509.04 lo 585.84 509.04 lo 585.84 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 509.04 t 740.16 509.04 lo 740.16 510.96 lo 585.84 510.96 lo 585.84 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 510.96 t 740.16 510.96 lo 740.16 513.12 lo 585.84 513.12 lo 585.84 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 513.12 t 740.16 513.12 lo 740.16 515.04 lo 585.84 515.04 lo 585.84 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 659.52 497.04 t 659.52 513.12 lo 666.96 513.12 lo 666.96 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<35> 659.52 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 46.80 t 107.04 80.88 lo 741.84 80.88 lo 741.84 46.80 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica-BoldOblique fcd /Helvetica-BoldOblique-ISO8859-1 fdf}if +/Helvetica-BoldOblique-ISO8859-1 ff [28.08 0 0 -28.08 0 0] mf sf +<5457454220476174657761792d537769746368696e6720696e205072696e6369706c6520494949> 151.20 73.92 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 660.72 293.76 t 660.72 296.64 lo 721.20 295.92 lo 721.20 293.04 lo 660.72 293.76 lo 660.72 293.76 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 110.88 255.60 t 110.88 277.92 lo 158.40 277.92 lo 158.40 255.60 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica fcd /Helvetica-ISO8859-1 fdf}if +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4f72672041> 110.88 273.60 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 112.32 318.24 t 112.32 340.56 lo 159.84 340.56 lo 159.84 318.24 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4f72672042> 112.32 336.24 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 437.28 187.92 t 518.40 187.92 lo 518.40 235.44 lo 437.28 235.44 lo 437.28 187.92 lo 437.28 187.92 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 435.84 186.48 t 438.72 189.36 lo 516.96 189.36 lo 519.84 186.48 lo 435.84 186.48 lo 435.84 186.48 lo eofill st gr +gs np 519.84 186.48 t 516.96 189.36 lo 516.96 234.00 lo 519.84 236.88 lo 519.84 186.48 lo 519.84 186.48 lo eofill st gr +gs np 519.84 236.88 t 516.96 234.00 lo 438.72 234.00 lo 435.84 236.88 lo 519.84 236.88 lo 519.84 236.88 lo eofill st gr +gs np 435.84 236.88 t 438.72 234.00 lo 438.72 189.36 lo 435.84 186.48 lo 435.84 236.88 lo 435.84 236.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 447.84 200.88 t 447.84 222.96 lo 508.32 222.96 lo 508.32 200.88 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4c44415044> 447.84 218.88 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 439.44 368.88 t 520.56 368.88 lo 520.56 416.40 lo 439.44 416.40 lo 439.44 368.88 lo 439.44 368.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 438.00 367.44 t 440.88 370.32 lo 519.12 370.32 lo 522.00 367.44 lo 438.00 367.44 lo 438.00 367.44 lo eofill st gr +gs np 522.00 367.44 t 519.12 370.32 lo 519.12 414.96 lo 522.00 417.84 lo 522.00 367.44 lo 522.00 367.44 lo eofill st gr +gs np 522.00 417.84 t 519.12 414.96 lo 440.88 414.96 lo 438.00 417.84 lo 522.00 417.84 lo 522.00 417.84 lo eofill st gr +gs np 438.00 417.84 t 440.88 414.96 lo 440.88 370.32 lo 438.00 367.44 lo 438.00 417.84 lo 438.00 417.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 450.00 381.84 t 450.00 403.92 lo 510.48 403.92 lo 510.48 381.84 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4c44415044> 450.00 399.84 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 651.12 256.32 t 644.16 256.08 lo 637.44 255.36 lo 630.96 254.16 lo 624.96 252.72 lo 618.96 250.56 lo 613.68 248.16 lo 608.64 245.52 lo 604.08 242.40 lo 600.00 239.04 lo 596.40 235.44 lo 593.28 231.36 lo 590.88 227.28 lo 589.20 222.96 lo 588.00 218.64 lo 587.76 213.84 lo 588.00 209.28 lo 589.20 204.72 lo 590.88 200.40 lo 593.28 196.32 lo 596.40 192.48 lo 600.00 188.88 lo 604.08 185.52 lo 608.64 182.40 lo 613.68 179.76 lo 618.96 177.36 lo 624.96 175.20 lo 630.96 173.52 lo 637.44 172.32 lo 644.16 171.60 lo 651.12 171.36 lo 657.84 171.60 lo 664.56 172.32 lo 671.04 173.52 lo 677.28 175.20 lo 683.04 177.36 lo 688.32 179.76 lo 693.36 182.40 lo 697.92 185.52 lo 702.24 188.88 lo 705.60 192.48 lo 708.72 196.32 lo 711.12 200.40 lo 712.80 204.72 lo 714.00 209.28 lo 714.48 213.84 lo 714.00 218.64 lo 712.80 222.96 lo 711.12 227.28 lo 708.72 231.36 lo 705.60 235.44 lo 702.24 239.04 lo 697.92 242.40 lo 693.36 245.52 lo 688.32 248.16 lo 683.04 250.56 lo 677.28 252.72 lo 671.04 254.16 lo 664.56 255.36 lo 657.84 256.08 lo 651.12 256.32 lo 651.12 256.32 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 651.12 257.76 t 651.12 254.88 lo 644.16 254.64 lo 643.92 257.52 lo 651.12 257.76 lo 651.12 257.76 lo eofill st gr +gs np 643.92 257.52 t 644.16 254.64 lo 637.68 253.92 lo 637.20 256.80 lo 643.92 257.52 lo 643.92 257.52 lo eofill st gr +gs np 637.20 256.80 t 637.68 253.92 lo 631.44 252.72 lo 630.72 255.60 lo 637.20 256.80 lo 637.20 256.80 lo eofill st gr +gs np 630.72 255.60 t 631.44 252.72 lo 625.20 251.28 lo 624.48 253.92 lo 630.72 255.60 lo 630.72 255.60 lo eofill st gr +gs np 624.48 253.92 t 625.20 251.28 lo 619.68 249.36 lo 618.48 252.00 lo 624.48 253.92 lo 624.48 253.92 lo eofill st gr +gs np 618.48 252.00 t 619.68 249.36 lo 614.40 246.96 lo 612.96 249.36 lo 618.48 252.00 lo 618.48 252.00 lo eofill st gr +gs np 612.96 249.36 t 614.40 246.96 lo 609.36 244.32 lo 607.92 246.72 lo 612.96 249.36 lo 612.96 249.36 lo eofill st gr +gs np 607.92 246.72 t 609.36 244.32 lo 604.80 241.20 lo 603.12 243.60 lo 607.92 246.72 lo 607.92 246.72 lo eofill st gr +gs np 603.12 243.60 t 604.80 241.20 lo 600.96 237.84 lo 599.04 240.00 lo 603.12 243.60 lo 603.12 243.60 lo eofill st gr +gs np 599.04 240.00 t 600.96 237.84 lo 597.36 234.48 lo 595.20 236.40 lo 599.04 240.00 lo 599.04 240.00 lo eofill st gr +gs np 595.20 236.40 t 597.36 234.48 lo 594.48 230.64 lo 592.08 232.32 lo 595.20 236.40 lo 595.20 236.40 lo eofill st gr +gs np 592.08 232.32 t 594.48 230.64 lo 592.08 226.56 lo 589.68 228.00 lo 592.08 232.32 lo 592.08 232.32 lo eofill st gr +gs np 589.68 228.00 t 592.08 226.56 lo 590.40 222.72 lo 587.76 223.44 lo 589.68 228.00 lo 589.68 228.00 lo eofill st gr +gs np 587.76 223.44 t 590.40 222.72 lo 589.44 218.40 lo 586.56 218.64 lo 587.76 223.44 lo 587.76 223.44 lo eofill st gr +gs np 586.56 218.64 t 589.44 218.40 lo 589.20 213.84 lo 586.32 213.84 lo 586.56 218.64 lo 586.56 218.64 lo eofill st gr +gs np 586.32 213.84 t 589.20 213.84 lo 589.44 209.52 lo 586.56 209.04 lo 586.32 213.84 lo 586.32 213.84 lo eofill st gr +gs np 586.56 209.04 t 589.44 209.52 lo 590.40 205.20 lo 587.76 204.48 lo 586.56 209.04 lo 586.56 209.04 lo eofill st gr +gs np 587.76 204.48 t 590.40 205.20 lo 592.32 201.12 lo 589.68 199.92 lo 587.76 204.48 lo 587.76 204.48 lo eofill st gr +gs np 589.68 199.92 t 592.32 201.12 lo 594.48 197.28 lo 592.08 195.60 lo 589.68 199.92 lo 589.68 199.92 lo eofill st gr +gs np 592.08 195.60 t 594.48 197.28 lo 597.36 193.44 lo 595.20 191.52 lo 592.08 195.60 lo 592.08 195.60 lo eofill st gr +gs np 595.20 191.52 t 597.36 193.44 lo 600.96 189.84 lo 599.04 187.68 lo 595.20 191.52 lo 595.20 191.52 lo eofill st gr +gs np 599.04 187.68 t 600.96 189.84 lo 604.80 186.72 lo 603.12 184.32 lo 599.04 187.68 lo 599.04 187.68 lo eofill st gr +gs np 603.12 184.32 t 604.80 186.72 lo 609.36 183.60 lo 607.92 181.20 lo 603.12 184.32 lo 603.12 184.32 lo eofill st gr +gs np 607.92 181.20 t 609.36 183.60 lo 614.16 180.96 lo 612.96 178.32 lo 607.92 181.20 lo 607.92 181.20 lo eofill st gr +gs np 612.96 178.32 t 614.16 180.96 lo 619.68 178.56 lo 618.48 175.92 lo 612.96 178.32 lo 612.96 178.32 lo eofill st gr +gs np 618.48 175.92 t 619.68 178.56 lo 625.20 176.64 lo 624.48 173.76 lo 618.48 175.92 lo 618.48 175.92 lo eofill st gr +gs np 624.48 173.76 t 625.20 176.64 lo 631.44 174.96 lo 630.72 172.32 lo 624.48 173.76 lo 624.48 173.76 lo eofill st gr +gs np 630.72 172.32 t 631.44 174.96 lo 637.68 173.76 lo 637.20 171.12 lo 630.72 172.32 lo 630.72 172.32 lo eofill st gr +gs np 637.20 171.12 t 637.68 173.76 lo 644.16 173.04 lo 644.16 170.40 lo 637.20 171.12 lo 637.20 171.12 lo eofill st gr +gs np 644.16 170.40 t 644.16 173.04 lo 651.12 172.80 lo 651.12 170.16 lo 644.16 170.40 lo 644.16 170.40 lo eofill st gr +gs np 651.12 170.16 t 651.12 172.80 lo 657.84 173.04 lo 658.08 170.16 lo 651.12 170.16 lo 651.12 170.16 lo eofill st gr +gs np 658.08 170.16 t 657.84 173.04 lo 664.32 173.76 lo 664.80 171.12 lo 658.08 170.16 lo 658.08 170.16 lo eofill st gr +gs np 664.80 171.12 t 664.32 173.76 lo 670.80 174.96 lo 671.28 172.32 lo 664.80 171.12 lo 664.80 171.12 lo eofill st gr +gs np 671.28 172.32 t 670.80 174.96 lo 676.80 176.64 lo 677.52 174.00 lo 671.28 172.32 lo 671.28 172.32 lo eofill st gr +gs np 677.52 174.00 t 676.80 176.64 lo 682.56 178.56 lo 683.52 175.92 lo 677.52 174.00 lo 677.52 174.00 lo eofill st gr +gs np 683.52 175.92 t 682.56 178.56 lo 687.84 180.96 lo 689.04 178.32 lo 683.52 175.92 lo 683.52 175.92 lo eofill st gr +gs np 689.04 178.32 t 687.84 180.96 lo 692.64 183.60 lo 694.08 181.20 lo 689.04 178.32 lo 689.04 178.32 lo eofill st gr +gs np 694.08 181.20 t 692.64 183.60 lo 697.20 186.72 lo 698.88 184.32 lo 694.08 181.20 lo 694.08 181.20 lo eofill st gr +gs np 698.88 184.32 t 697.20 186.72 lo 701.28 189.84 lo 703.20 187.92 lo 698.88 184.32 lo 698.88 184.32 lo eofill st gr +gs np 703.20 187.92 t 701.28 189.84 lo 704.64 193.44 lo 706.80 191.52 lo 703.20 187.92 lo 703.20 187.92 lo eofill st gr +gs np 706.80 191.52 t 704.64 193.44 lo 707.52 197.28 lo 709.92 195.60 lo 706.80 191.52 lo 706.80 191.52 lo eofill st gr +gs np 709.92 195.60 t 707.52 197.28 lo 709.92 201.12 lo 712.32 199.92 lo 709.92 195.60 lo 709.92 195.60 lo eofill st gr +gs np 712.32 199.92 t 709.92 201.12 lo 711.60 205.20 lo 714.24 204.48 lo 712.32 199.92 lo 712.32 199.92 lo eofill st gr +gs np 714.24 204.48 t 711.60 205.20 lo 712.56 209.52 lo 715.44 209.04 lo 714.24 204.48 lo 714.24 204.48 lo eofill st gr +gs np 715.44 209.04 t 712.56 209.52 lo 713.04 213.84 lo 715.92 214.08 lo 715.44 209.04 lo 715.44 209.04 lo eofill st gr +gs np 715.92 214.08 t 713.04 213.84 lo 712.56 218.40 lo 715.44 218.88 lo 715.92 214.08 lo 715.92 214.08 lo eofill st gr +gs np 715.44 218.88 t 712.56 218.40 lo 711.60 222.48 lo 714.24 223.44 lo 715.44 218.88 lo 715.44 218.88 lo eofill st gr +gs np 714.24 223.44 t 711.60 222.48 lo 709.92 226.80 lo 712.32 228.00 lo 714.24 223.44 lo 714.24 223.44 lo eofill st gr +gs np 712.32 228.00 t 709.92 226.80 lo 707.52 230.64 lo 709.92 232.32 lo 712.32 228.00 lo 712.32 228.00 lo eofill st gr +gs np 709.92 232.32 t 707.52 230.64 lo 704.64 234.48 lo 706.80 236.16 lo 709.92 232.32 lo 709.92 232.32 lo eofill st gr +gs np 706.80 236.16 t 704.64 234.48 lo 701.28 237.84 lo 703.20 240.00 lo 706.80 236.16 lo 706.80 236.16 lo eofill st gr +gs np 703.20 240.00 t 701.28 237.84 lo 697.20 241.20 lo 698.88 243.60 lo 703.20 240.00 lo 703.20 240.00 lo eofill st gr +gs np 698.88 243.60 t 697.20 241.20 lo 692.64 244.32 lo 694.08 246.72 lo 698.88 243.60 lo 698.88 243.60 lo eofill st gr +gs np 694.08 246.72 t 692.64 244.32 lo 687.84 246.96 lo 689.04 249.36 lo 694.08 246.72 lo 694.08 246.72 lo eofill st gr +gs np 689.04 249.36 t 687.84 246.96 lo 682.56 249.36 lo 683.52 252.00 lo 689.04 249.36 lo 689.04 249.36 lo eofill st gr +gs np 683.52 252.00 t 682.56 249.36 lo 676.80 251.28 lo 677.52 253.92 lo 683.52 252.00 lo 683.52 252.00 lo eofill st gr +gs np 677.52 253.92 t 676.80 251.28 lo 670.80 252.72 lo 671.28 255.60 lo 677.52 253.92 lo 677.52 253.92 lo eofill st gr +gs np 671.28 255.60 t 670.80 252.72 lo 664.32 253.92 lo 664.80 256.80 lo 671.28 255.60 lo 671.28 255.60 lo eofill st gr +gs np 664.80 256.80 t 664.32 253.92 lo 657.84 254.64 lo 658.08 257.52 lo 664.80 256.80 lo 664.80 256.80 lo eofill st gr +gs np 658.08 257.52 t 657.84 254.64 lo 651.12 254.88 lo 651.12 257.76 lo 658.08 257.52 lo 658.08 257.52 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 624.96 203.04 t 624.96 225.36 lo 677.52 225.36 lo 677.52 203.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4453412031> 624.96 221.04 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 650.88 435.12 t 644.16 434.88 lo 637.44 434.16 lo 630.96 432.96 lo 624.72 431.28 lo 618.96 429.36 lo 613.68 426.96 lo 608.64 424.08 lo 604.08 421.20 lo 599.76 417.60 lo 596.40 414.00 lo 593.28 410.16 lo 590.88 406.08 lo 589.20 401.76 lo 588.00 397.20 lo 587.76 392.64 lo 588.00 388.08 lo 589.20 383.52 lo 590.88 379.20 lo 593.28 375.12 lo 596.40 371.28 lo 599.76 367.68 lo 604.08 364.08 lo 608.64 361.20 lo 613.68 358.32 lo 618.96 355.92 lo 624.72 354.00 lo 630.96 352.32 lo 637.44 351.12 lo 644.16 350.40 lo 650.88 350.16 lo 657.84 350.40 lo 664.56 351.12 lo 671.04 352.32 lo 677.04 354.00 lo 683.04 355.92 lo 688.32 358.32 lo 693.36 361.20 lo 697.92 364.08 lo 702.00 367.68 lo 705.60 371.28 lo 708.72 375.12 lo 711.12 379.20 lo 712.80 383.52 lo 714.00 388.08 lo 714.24 392.64 lo 714.00 397.20 lo 712.80 401.76 lo 711.12 406.08 lo 708.72 410.16 lo 705.60 414.00 lo 702.00 417.60 lo 697.92 421.20 lo 693.36 424.08 lo 688.32 426.96 lo 683.04 429.36 lo 677.04 431.28 lo 671.04 432.96 lo 664.56 434.16 lo 657.84 434.88 lo 650.88 435.12 lo 650.88 435.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 650.88 436.56 t 650.88 433.68 lo 644.16 433.44 lo 643.92 436.32 lo 650.88 436.56 lo 650.88 436.56 lo eofill st gr +gs np 643.92 436.32 t 644.16 433.44 lo 637.68 432.72 lo 637.20 435.60 lo 643.92 436.32 lo 643.92 436.32 lo eofill st gr +gs np 637.20 435.60 t 637.68 432.72 lo 631.20 431.52 lo 630.72 434.40 lo 637.20 435.60 lo 637.20 435.60 lo eofill st gr +gs np 630.72 434.40 t 631.20 431.52 lo 625.20 430.08 lo 624.48 432.72 lo 630.72 434.40 lo 630.72 434.40 lo eofill st gr +gs np 624.48 432.72 t 625.20 430.08 lo 619.44 427.92 lo 618.48 430.56 lo 624.48 432.72 lo 624.48 432.72 lo eofill st gr +gs np 618.48 430.56 t 619.44 427.92 lo 614.16 425.52 lo 612.96 428.16 lo 618.48 430.56 lo 618.48 430.56 lo eofill st gr +gs np 612.96 428.16 t 614.16 425.52 lo 609.36 422.88 lo 607.92 425.28 lo 612.96 428.16 lo 612.96 428.16 lo eofill st gr +gs np 607.92 425.28 t 609.36 422.88 lo 604.80 420.00 lo 603.12 422.16 lo 607.92 425.28 lo 607.92 425.28 lo eofill st gr +gs np 603.12 422.16 t 604.80 420.00 lo 600.72 416.64 lo 598.80 418.80 lo 603.12 422.16 lo 603.12 422.16 lo eofill st gr +gs np 598.80 418.80 t 600.72 416.64 lo 597.36 413.04 lo 595.20 414.96 lo 598.80 418.80 lo 598.80 418.80 lo eofill st gr +gs np 595.20 414.96 t 597.36 413.04 lo 594.48 409.44 lo 592.08 410.88 lo 595.20 414.96 lo 595.20 414.96 lo eofill st gr +gs np 592.08 410.88 t 594.48 409.44 lo 592.08 405.36 lo 589.68 406.56 lo 592.08 410.88 lo 592.08 410.88 lo eofill st gr +gs np 589.68 406.56 t 592.08 405.36 lo 590.40 401.28 lo 587.76 402.24 lo 589.68 406.56 lo 589.68 406.56 lo eofill st gr +gs np 587.76 402.24 t 590.40 401.28 lo 589.44 396.96 lo 586.56 397.44 lo 587.76 402.24 lo 587.76 402.24 lo eofill st gr +gs np 586.56 397.44 t 589.44 396.96 lo 588.96 392.64 lo 586.32 392.64 lo 586.56 397.44 lo 586.56 397.44 lo eofill st gr +gs np 586.32 392.64 t 588.96 392.64 lo 589.44 388.32 lo 586.56 387.84 lo 586.32 392.64 lo 586.32 392.64 lo eofill st gr +gs np 586.56 387.84 t 589.44 388.32 lo 590.40 384.00 lo 587.76 383.04 lo 586.56 387.84 lo 586.56 387.84 lo eofill st gr +gs np 587.76 383.04 t 590.40 384.00 lo 592.08 379.92 lo 589.68 378.72 lo 587.76 383.04 lo 587.76 383.04 lo eofill st gr +gs np 589.68 378.72 t 592.08 379.92 lo 594.48 375.84 lo 592.08 374.40 lo 589.68 378.72 lo 589.68 378.72 lo eofill st gr +gs np 592.08 374.40 t 594.48 375.84 lo 597.36 372.24 lo 595.20 370.32 lo 592.08 374.40 lo 592.08 374.40 lo eofill st gr +gs np 595.20 370.32 t 597.36 372.24 lo 600.72 368.64 lo 598.80 366.48 lo 595.20 370.32 lo 595.20 370.32 lo eofill st gr +gs np 598.80 366.48 t 600.72 368.64 lo 604.80 365.28 lo 603.12 363.12 lo 598.80 366.48 lo 598.80 366.48 lo eofill st gr +gs np 603.12 363.12 t 604.80 365.28 lo 609.36 362.40 lo 607.92 360.00 lo 603.12 363.12 lo 603.12 363.12 lo eofill st gr +gs np 607.92 360.00 t 609.36 362.40 lo 614.16 359.76 lo 612.96 357.12 lo 607.92 360.00 lo 607.92 360.00 lo eofill st gr +gs np 612.96 357.12 t 614.16 359.76 lo 619.44 357.36 lo 618.48 354.72 lo 612.96 357.12 lo 612.96 357.12 lo eofill st gr +gs np 618.48 354.72 t 619.44 357.36 lo 625.20 355.20 lo 624.48 352.56 lo 618.48 354.72 lo 618.48 354.72 lo eofill st gr +gs np 624.48 352.56 t 625.20 355.20 lo 631.20 353.76 lo 630.72 350.88 lo 624.48 352.56 lo 624.48 352.56 lo eofill st gr +gs np 630.72 350.88 t 631.20 353.76 lo 637.68 352.56 lo 637.20 349.68 lo 630.72 350.88 lo 630.72 350.88 lo eofill st gr +gs np 637.20 349.68 t 637.68 352.56 lo 644.16 351.84 lo 643.92 348.96 lo 637.20 349.68 lo 637.20 349.68 lo eofill st gr +gs np 643.92 348.96 t 644.16 351.84 lo 650.88 351.60 lo 651.12 348.72 lo 643.92 348.96 lo 643.92 348.96 lo eofill st gr +gs np 651.12 348.72 t 650.88 351.60 lo 657.84 351.84 lo 657.84 348.96 lo 651.12 348.72 lo 651.12 348.72 lo eofill st gr +gs np 657.84 348.96 t 657.84 351.84 lo 664.32 352.56 lo 664.80 349.68 lo 657.84 348.96 lo 657.84 348.96 lo eofill st gr +gs np 664.80 349.68 t 664.32 352.56 lo 670.56 353.76 lo 671.28 350.88 lo 664.80 349.68 lo 664.80 349.68 lo eofill st gr +gs np 671.28 350.88 t 670.56 353.76 lo 676.80 355.20 lo 677.52 352.56 lo 671.28 350.88 lo 671.28 350.88 lo eofill st gr +gs np 677.52 352.56 t 676.80 355.20 lo 682.32 357.36 lo 683.52 354.72 lo 677.52 352.56 lo 677.52 352.56 lo eofill st gr +gs np 683.52 354.72 t 682.32 357.36 lo 687.60 359.76 lo 689.04 357.12 lo 683.52 354.72 lo 683.52 354.72 lo eofill st gr +gs np 689.04 357.12 t 687.60 359.76 lo 692.64 362.40 lo 694.08 360.00 lo 689.04 357.12 lo 689.04 357.12 lo eofill st gr +gs np 694.08 360.00 t 692.64 362.40 lo 697.20 365.28 lo 698.88 363.12 lo 694.08 360.00 lo 694.08 360.00 lo eofill st gr +gs np 698.88 363.12 t 697.20 365.28 lo 701.04 368.64 lo 702.96 366.48 lo 698.88 363.12 lo 698.88 363.12 lo eofill st gr +gs np 702.96 366.48 t 701.04 368.64 lo 704.64 372.24 lo 706.80 370.32 lo 702.96 366.48 lo 702.96 366.48 lo eofill st gr +gs np 706.80 370.32 t 704.64 372.24 lo 707.52 375.84 lo 709.92 374.40 lo 706.80 370.32 lo 706.80 370.32 lo eofill st gr +gs np 709.92 374.40 t 707.52 375.84 lo 709.92 379.92 lo 712.32 378.72 lo 709.92 374.40 lo 709.92 374.40 lo eofill st gr +gs np 712.32 378.72 t 709.92 379.92 lo 711.36 384.00 lo 714.24 383.04 lo 712.32 378.72 lo 712.32 378.72 lo eofill st gr +gs np 714.24 383.04 t 711.36 384.00 lo 712.56 388.32 lo 715.20 387.84 lo 714.24 383.04 lo 714.24 383.04 lo eofill st gr +gs np 715.20 387.84 t 712.56 388.32 lo 712.80 392.64 lo 715.68 392.64 lo 715.20 387.84 lo 715.20 387.84 lo eofill st gr +gs np 715.68 392.64 t 712.80 392.64 lo 712.56 396.96 lo 715.44 397.44 lo 715.68 392.64 lo 715.68 392.64 lo eofill st gr +gs np 715.44 397.44 t 712.56 396.96 lo 711.36 401.28 lo 714.24 402.24 lo 715.44 397.44 lo 715.44 397.44 lo eofill st gr +gs np 714.24 402.24 t 711.36 401.28 lo 709.68 405.36 lo 712.32 406.56 lo 714.24 402.24 lo 714.24 402.24 lo eofill st gr +gs np 712.32 406.56 t 709.68 405.36 lo 707.52 409.44 lo 709.92 410.88 lo 712.32 406.56 lo 712.32 406.56 lo eofill st gr +gs np 709.92 410.88 t 707.52 409.44 lo 704.64 413.04 lo 706.80 414.96 lo 709.92 410.88 lo 709.92 410.88 lo eofill st gr +gs np 706.80 414.96 t 704.64 413.04 lo 701.04 416.64 lo 702.96 418.80 lo 706.80 414.96 lo 706.80 414.96 lo eofill st gr +gs np 702.96 418.80 t 701.04 416.64 lo 697.20 420.00 lo 698.88 422.16 lo 702.96 418.80 lo 702.96 418.80 lo eofill st gr +gs np 698.88 422.16 t 697.20 420.00 lo 692.64 422.88 lo 694.08 425.28 lo 698.88 422.16 lo 698.88 422.16 lo eofill st gr +gs np 694.08 425.28 t 692.64 422.88 lo 687.84 425.52 lo 689.04 428.16 lo 694.08 425.28 lo 694.08 425.28 lo eofill st gr +gs np 689.04 428.16 t 687.84 425.52 lo 682.32 427.92 lo 683.52 430.56 lo 689.04 428.16 lo 689.04 428.16 lo eofill st gr +gs np 683.52 430.56 t 682.32 427.92 lo 676.80 430.08 lo 677.52 432.72 lo 683.52 430.56 lo 683.52 430.56 lo eofill st gr +gs np 677.52 432.72 t 676.80 430.08 lo 670.56 431.52 lo 671.28 434.40 lo 677.52 432.72 lo 677.52 432.72 lo eofill st gr +gs np 671.28 434.40 t 670.56 431.52 lo 664.32 432.72 lo 664.80 435.60 lo 671.28 434.40 lo 671.28 434.40 lo eofill st gr +gs np 664.80 435.60 t 664.32 432.72 lo 657.84 433.44 lo 657.84 436.32 lo 664.80 435.60 lo 664.80 435.60 lo eofill st gr +gs np 657.84 436.32 t 657.84 433.44 lo 650.88 433.68 lo 650.88 436.56 lo 657.84 436.32 lo 657.84 436.32 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 624.96 381.84 t 624.96 403.92 lo 677.52 403.92 lo 677.52 381.84 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<4453412032> 624.96 399.84 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 280.08 185.52 t 363.36 185.52 lo 363.36 236.40 lo 280.08 236.40 lo 280.08 185.52 lo 280.08 185.52 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 278.64 184.32 t 281.52 186.96 lo 362.16 186.96 lo 364.80 184.32 lo 278.64 184.32 lo 278.64 184.32 lo eofill st gr +gs np 364.80 184.32 t 362.16 186.96 lo 362.16 234.96 lo 364.80 237.60 lo 364.80 184.32 lo 364.80 184.32 lo eofill st gr +gs np 364.80 237.60 t 362.16 234.96 lo 281.52 234.96 lo 278.64 237.60 lo 364.80 237.60 lo 364.80 237.60 lo eofill st gr +gs np 278.64 237.60 t 281.52 234.96 lo 281.52 186.96 lo 278.64 184.32 lo 278.64 237.60 lo 278.64 237.60 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 287.28 200.16 t 287.28 222.24 lo 356.64 222.24 lo 356.64 200.16 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<545745422041> 287.28 218.16 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 540.24 210.24 t 540.24 213.12 lo 541.68 213.12 lo 541.68 210.24 lo 540.24 210.24 lo 540.24 210.24 lo eofill st gr +gs np 542.88 210.24 t 542.88 213.12 lo 544.32 213.12 lo 544.32 210.24 lo 542.88 210.24 lo 542.88 210.24 lo eofill st gr +gs np 545.76 210.24 t 545.76 213.12 lo 547.20 213.12 lo 547.20 210.24 lo 545.76 210.24 lo 545.76 210.24 lo eofill st gr +gs np 548.64 210.24 t 548.64 213.12 lo 550.08 213.12 lo 550.08 210.24 lo 548.64 210.24 lo 548.64 210.24 lo eofill st gr +gs np 551.52 210.24 t 551.52 213.12 lo 552.96 213.12 lo 552.96 210.24 lo 551.52 210.24 lo 551.52 210.24 lo eofill st gr +gs np 554.40 210.24 t 554.40 213.12 lo 555.84 213.12 lo 555.84 210.24 lo 554.40 210.24 lo 554.40 210.24 lo eofill st gr +gs np 557.28 210.24 t 557.28 213.12 lo 558.72 213.12 lo 558.72 210.24 lo 557.28 210.24 lo 557.28 210.24 lo eofill st gr +gs np 560.16 210.24 t 560.16 213.12 lo 561.60 213.12 lo 561.60 210.24 lo 560.16 210.24 lo 560.16 210.24 lo eofill st gr +gs np 562.80 210.24 t 562.80 213.12 lo 564.24 213.12 lo 564.24 210.24 lo 562.80 210.24 lo 562.80 210.24 lo eofill st gr +gs np 565.68 210.24 t 565.68 213.12 lo 567.12 213.12 lo 567.12 210.24 lo 565.68 210.24 lo 565.68 210.24 lo eofill st gr +gs np 568.56 210.24 t 568.56 213.12 lo 569.76 213.12 lo 569.76 210.24 lo 568.56 210.24 lo 568.56 210.24 lo eofill st gr +gs np 529.68 211.68 t 542.40 216.00 lo 542.40 207.36 lo 529.68 211.68 lo eofill st gr +gs np 580.32 211.68 t 567.60 207.36 lo 567.60 216.00 lo 580.32 211.68 lo eofill st gr +gs np 384.00 208.56 t 384.00 211.20 lo 385.44 211.20 lo 385.44 208.56 lo 384.00 208.56 lo 384.00 208.56 lo eofill st gr +gs np 386.88 208.56 t 386.88 211.20 lo 388.32 211.20 lo 388.32 208.56 lo 386.88 208.56 lo 386.88 208.56 lo eofill st gr +gs np 389.76 208.56 t 389.76 211.20 lo 391.20 211.20 lo 391.20 208.56 lo 389.76 208.56 lo 389.76 208.56 lo eofill st gr +gs np 392.64 208.56 t 392.64 211.20 lo 394.08 211.20 lo 394.08 208.56 lo 392.64 208.56 lo 392.64 208.56 lo eofill st gr +gs np 395.52 208.56 t 395.52 211.20 lo 396.96 211.20 lo 396.96 208.56 lo 395.52 208.56 lo 395.52 208.56 lo eofill st gr +gs np 398.40 208.56 t 398.40 211.20 lo 399.84 211.20 lo 399.84 208.56 lo 398.40 208.56 lo 398.40 208.56 lo eofill st gr +gs np 401.04 208.56 t 401.04 211.20 lo 402.48 211.20 lo 402.48 208.56 lo 401.04 208.56 lo 401.04 208.56 lo eofill st gr +gs np 403.92 208.56 t 403.92 211.20 lo 405.36 211.20 lo 405.36 208.56 lo 403.92 208.56 lo 403.92 208.56 lo eofill st gr +gs np 406.80 208.56 t 406.80 211.20 lo 408.24 211.20 lo 408.24 208.56 lo 406.80 208.56 lo 406.80 208.56 lo eofill st gr +gs np 409.68 208.56 t 409.68 211.20 lo 411.12 211.20 lo 411.12 208.56 lo 409.68 208.56 lo 409.68 208.56 lo eofill st gr +gs np 412.56 208.56 t 412.56 211.20 lo 413.76 211.20 lo 413.76 208.56 lo 412.56 208.56 lo 412.56 208.56 lo eofill st gr +gs np 373.44 209.76 t 386.40 214.08 lo 386.40 205.68 lo 373.44 209.76 lo eofill st gr +gs np 424.32 209.76 t 411.36 205.68 lo 411.36 214.08 lo 424.32 209.76 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 112.32 365.04 t 198.72 365.04 lo 198.72 418.80 lo 112.32 418.80 lo 112.32 365.04 lo 112.32 365.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 110.88 363.84 t 113.76 366.48 lo 197.52 366.48 lo 200.16 363.84 lo 110.88 363.84 lo 110.88 363.84 lo eofill st gr +gs np 200.16 363.84 t 197.52 366.48 lo 197.52 417.36 lo 200.16 420.24 lo 200.16 363.84 lo 200.16 363.84 lo eofill st gr +gs np 200.16 420.24 t 197.52 417.36 lo 113.76 417.36 lo 110.88 420.24 lo 200.16 420.24 lo 200.16 420.24 lo eofill st gr +gs np 110.88 420.24 t 113.76 417.36 lo 113.76 366.48 lo 110.88 363.84 lo 110.88 420.24 lo 110.88 420.24 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 122.40 381.12 t 122.40 403.44 lo 189.12 403.44 lo 189.12 381.12 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<42726f77736572> 122.40 399.12 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +1.000 1.000 1.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 276.96 366.72 t 360.48 366.72 lo 360.48 417.36 lo 276.96 417.36 lo 276.96 366.72 lo 276.96 366.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 275.52 365.28 t 278.40 368.16 lo 359.04 368.16 lo 361.92 365.28 lo 275.52 365.28 lo 275.52 365.28 lo eofill st gr +gs np 361.92 365.28 t 359.04 368.16 lo 359.04 415.92 lo 361.92 418.80 lo 361.92 365.28 lo 361.92 365.28 lo eofill st gr +gs np 361.92 418.80 t 359.04 415.92 lo 278.40 415.92 lo 275.52 418.80 lo 361.92 418.80 lo 361.92 418.80 lo eofill st gr +gs np 275.52 418.80 t 278.40 415.92 lo 278.40 368.16 lo 275.52 365.28 lo 275.52 418.80 lo 275.52 418.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 284.16 381.12 t 284.16 403.20 lo 353.76 403.20 lo 353.76 381.12 lo +cp clip np +0.000 0.000 0.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<545745422042> 284.16 399.12 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 215.52 339.12 t 217.92 340.80 lo 218.64 339.60 lo 216.24 338.16 lo 215.52 339.12 lo 215.52 339.12 lo eofill st gr +gs np 216.96 336.96 t 219.36 338.40 lo 220.08 337.20 lo 217.92 335.76 lo 216.96 336.96 lo 216.96 336.96 lo eofill st gr +gs np 218.64 334.56 t 221.04 336.00 lo 221.76 335.04 lo 219.36 333.36 lo 218.64 334.56 lo 218.64 334.56 lo eofill st gr +gs np 220.32 332.16 t 222.48 333.84 lo 223.44 332.64 lo 221.04 330.96 lo 220.32 332.16 lo 220.32 332.16 lo eofill st gr +gs np 221.76 329.76 t 224.16 331.44 lo 224.88 330.24 lo 222.72 328.56 lo 221.76 329.76 lo 221.76 329.76 lo eofill st gr +gs np 223.44 327.36 t 225.84 329.04 lo 226.56 327.84 lo 224.16 326.16 lo 223.44 327.36 lo 223.44 327.36 lo eofill st gr +gs np 224.88 325.20 t 227.28 326.64 lo 228.24 325.44 lo 225.84 324.00 lo 224.88 325.20 lo 224.88 325.20 lo eofill st gr +gs np 226.56 322.80 t 228.96 324.24 lo 229.68 323.04 lo 227.28 321.60 lo 226.56 322.80 lo 226.56 322.80 lo eofill st gr +gs np 228.24 320.40 t 230.64 321.84 lo 231.36 320.88 lo 228.96 319.20 lo 228.24 320.40 lo 228.24 320.40 lo eofill st gr +gs np 229.68 318.00 t 232.08 319.68 lo 233.04 318.48 lo 230.64 316.80 lo 229.68 318.00 lo 229.68 318.00 lo eofill st gr +gs np 231.36 315.60 t 233.76 317.28 lo 234.48 316.08 lo 232.08 314.40 lo 231.36 315.60 lo 231.36 315.60 lo eofill st gr +gs np 233.04 313.20 t 235.44 314.88 lo 236.16 313.68 lo 233.76 312.00 lo 233.04 313.20 lo 233.04 313.20 lo eofill st gr +gs np 234.48 311.04 t 236.88 312.48 lo 237.60 311.28 lo 235.44 309.84 lo 234.48 311.04 lo 234.48 311.04 lo eofill st gr +gs np 236.16 308.64 t 238.56 310.08 lo 239.28 308.88 lo 236.88 307.44 lo 236.16 308.64 lo 236.16 308.64 lo eofill st gr +gs np 237.60 306.24 t 240.00 307.92 lo 240.96 306.72 lo 238.56 305.04 lo 237.60 306.24 lo 237.60 306.24 lo eofill st gr +gs np 239.28 303.84 t 241.68 305.52 lo 242.40 304.32 lo 240.00 302.64 lo 239.28 303.84 lo 239.28 303.84 lo eofill st gr +gs np 240.96 301.44 t 243.36 303.12 lo 244.08 301.92 lo 241.68 300.24 lo 240.96 301.44 lo 240.96 301.44 lo eofill st gr +gs np 242.40 299.04 t 244.80 300.72 lo 245.76 299.52 lo 243.36 298.08 lo 242.40 299.04 lo 242.40 299.04 lo eofill st gr +gs np 244.08 296.88 t 246.48 298.32 lo 247.20 297.12 lo 244.80 295.68 lo 244.08 296.88 lo 244.08 296.88 lo eofill st gr +gs np 245.76 294.48 t 247.92 295.92 lo 248.88 294.96 lo 246.48 293.28 lo 245.76 294.48 lo 245.76 294.48 lo eofill st gr +gs np 247.20 292.08 t 249.60 293.76 lo 250.32 292.56 lo 248.16 290.88 lo 247.20 292.08 lo 247.20 292.08 lo eofill st gr +gs np 248.88 289.68 t 251.28 291.36 lo 252.00 290.16 lo 249.60 288.48 lo 248.88 289.68 lo 248.88 289.68 lo eofill st gr +gs np 250.56 287.28 t 252.72 288.96 lo 253.68 287.76 lo 251.28 286.08 lo 250.56 287.28 lo 250.56 287.28 lo eofill st gr +gs np 252.00 285.12 t 254.40 286.56 lo 255.12 285.36 lo 252.96 283.92 lo 252.00 285.12 lo 252.00 285.12 lo eofill st gr +gs np 253.68 282.72 t 256.08 284.16 lo 256.80 282.96 lo 254.40 281.52 lo 253.68 282.72 lo 253.68 282.72 lo eofill st gr +gs np 255.12 280.32 t 257.52 281.76 lo 258.24 280.80 lo 256.08 279.12 lo 255.12 280.32 lo 255.12 280.32 lo eofill st gr +gs np 256.80 277.92 t 259.20 279.60 lo 259.92 278.40 lo 257.52 276.72 lo 256.80 277.92 lo 256.80 277.92 lo eofill st gr +gs np 258.48 275.52 t 260.64 277.20 lo 261.60 276.00 lo 259.20 274.32 lo 258.48 275.52 lo 258.48 275.52 lo eofill st gr +gs np 259.92 273.12 t 262.32 274.80 lo 263.04 273.60 lo 260.88 271.92 lo 259.92 273.12 lo 259.92 273.12 lo eofill st gr +gs np 261.60 270.96 t 264.00 272.40 lo 264.72 271.20 lo 262.32 269.76 lo 261.60 270.96 lo 261.60 270.96 lo eofill st gr +gs np 263.28 268.56 t 265.44 270.00 lo 266.40 268.80 lo 264.00 267.36 lo 263.28 268.56 lo 263.28 268.56 lo eofill st gr +gs np 264.72 266.16 t 267.12 267.60 lo 267.84 266.64 lo 265.44 264.96 lo 264.72 266.16 lo 264.72 266.16 lo eofill st gr +gs np 266.40 263.76 t 268.80 265.44 lo 269.28 264.48 lo 266.88 262.80 lo 266.40 263.76 lo 266.40 263.76 lo eofill st gr +gs np 210.72 348.72 t 221.52 340.56 lo 214.32 335.76 lo 210.72 348.72 lo eofill st gr +gs np 274.08 254.88 t 263.28 263.04 lo 270.48 267.84 lo 274.08 254.88 lo eofill st gr +gs np 129.84 292.56 t 129.84 295.44 lo 226.32 295.92 lo 226.32 293.04 lo 129.84 292.56 lo 129.84 292.56 lo eofill st gr +gs np 652.56 278.16 t 649.68 278.16 lo 649.68 279.60 lo 652.56 279.60 lo 652.56 278.16 lo 652.56 278.16 lo eofill st gr +gs np 652.56 281.04 t 649.68 281.04 lo 649.68 282.48 lo 652.56 282.48 lo 652.56 281.04 lo 652.56 281.04 lo eofill st gr +gs np 652.56 283.92 t 649.68 283.92 lo 649.68 285.36 lo 652.56 285.36 lo 652.56 283.92 lo 652.56 283.92 lo eofill st gr +gs np 652.56 286.80 t 649.68 286.80 lo 649.68 288.00 lo 652.56 288.00 lo 652.56 286.80 lo 652.56 286.80 lo eofill st gr +gs np 652.56 289.44 t 649.68 289.44 lo 649.68 290.88 lo 652.56 290.88 lo 652.56 289.44 lo 652.56 289.44 lo eofill st gr +gs np 652.56 292.32 t 649.68 292.32 lo 649.68 293.76 lo 652.56 293.76 lo 652.56 292.32 lo 652.56 292.32 lo eofill st gr +gs np 652.56 295.20 t 649.68 295.20 lo 649.68 296.64 lo 652.56 296.64 lo 652.56 295.20 lo 652.56 295.20 lo eofill st gr +gs np 652.56 298.08 t 649.68 298.08 lo 649.68 299.52 lo 652.56 299.52 lo 652.56 298.08 lo 652.56 298.08 lo eofill st gr +gs np 652.56 300.96 t 649.68 300.96 lo 649.68 302.40 lo 652.56 302.40 lo 652.56 300.96 lo 652.56 300.96 lo eofill st gr +gs np 652.56 303.84 t 649.68 303.84 lo 649.68 305.28 lo 652.56 305.28 lo 652.56 303.84 lo 652.56 303.84 lo eofill st gr +gs np 652.56 306.48 t 649.68 306.48 lo 649.68 307.92 lo 652.56 307.92 lo 652.56 306.48 lo 652.56 306.48 lo eofill st gr +gs np 652.56 309.36 t 649.68 309.36 lo 649.68 310.80 lo 652.56 310.80 lo 652.56 309.36 lo 652.56 309.36 lo eofill st gr +gs np 652.56 312.24 t 649.68 312.24 lo 649.68 313.68 lo 652.56 313.68 lo 652.56 312.24 lo 652.56 312.24 lo eofill st gr +gs np 652.56 315.12 t 649.68 315.12 lo 649.68 316.56 lo 652.56 316.56 lo 652.56 315.12 lo 652.56 315.12 lo eofill st gr +gs np 652.56 318.00 t 649.68 318.00 lo 649.68 319.44 lo 652.56 319.44 lo 652.56 318.00 lo 652.56 318.00 lo eofill st gr +gs np 652.56 320.88 t 649.68 320.88 lo 649.68 322.32 lo 652.56 322.32 lo 652.56 320.88 lo 652.56 320.88 lo eofill st gr +gs np 652.56 323.76 t 649.68 323.76 lo 649.68 325.20 lo 652.56 325.20 lo 652.56 323.76 lo 652.56 323.76 lo eofill st gr +gs np 652.56 326.40 t 649.68 326.40 lo 649.68 327.84 lo 652.56 327.84 lo 652.56 326.40 lo 652.56 326.40 lo eofill st gr +gs np 652.56 329.28 t 649.68 329.28 lo 649.68 330.72 lo 652.56 330.72 lo 652.56 329.28 lo 652.56 329.28 lo eofill st gr +gs np 651.12 267.60 t 646.80 280.32 lo 655.20 280.32 lo 651.12 267.60 lo eofill st gr +gs np 651.12 337.68 t 646.80 329.04 lo 655.20 329.04 lo 651.12 337.68 lo 651.12 337.68 lo eofill st gr +gs np 274.56 293.28 t 274.56 296.16 lo 637.68 295.92 lo 637.68 293.04 lo 274.56 293.28 lo 274.56 293.28 lo eofill st gr +gs np 538.32 390.96 t 538.32 393.84 lo 567.84 393.84 lo 567.84 390.96 lo 538.32 390.96 lo 538.32 390.96 lo eofill st gr +gs np 527.76 392.40 t 540.72 396.72 lo 540.72 388.08 lo 527.76 392.40 lo eofill st gr +gs np 578.40 392.40 t 565.68 388.08 lo 565.68 396.72 lo 578.40 392.40 lo eofill st gr +gs np 382.32 389.28 t 382.32 391.92 lo 411.84 391.92 lo 411.84 389.28 lo 382.32 389.28 lo 382.32 389.28 lo eofill st gr +gs np 371.76 390.72 t 384.48 394.80 lo 384.48 386.40 lo 371.76 390.72 lo eofill st gr +gs np 422.40 390.72 t 409.68 386.40 lo 409.68 394.80 lo 422.40 390.72 lo eofill st gr +gs np 221.76 388.80 t 221.76 391.68 lo 251.28 391.68 lo 251.28 388.80 lo 221.76 388.80 lo 221.76 388.80 lo eofill st gr +gs np 211.20 390.24 t 224.16 394.56 lo 224.16 385.92 lo 211.20 390.24 lo eofill st gr +gs np 262.08 390.24 t 249.12 385.92 lo 249.12 394.56 lo 262.08 390.24 lo eofill st gr +gr +%%PageTrailer +rs +%%BoundingBox: 18 18 555 759 +showpage +%%BeginSetup +%%BeginFeature: *PageRegion A4 + a4 +%%EndFeature +%%EndSetup +%%Page: 6 6 +%%BeginPageSetup +/#copies 1 def +sv +90 rotate +1.00 -1.00 sl +18.96 18.00 tl +%%EndPageSetup +%%BoundingBox: (atend) +gs +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.72 537.84 t 66.72 25.20 lo 66.72 25.20 lo 66.72 537.84 lo 66.72 537.84 lo eofill st gr +gs np 66.72 537.84 t 66.72 25.20 lo 68.64 25.20 lo 68.64 537.84 lo 66.72 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.122 0.122 0.122 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 68.64 537.84 t 68.64 25.20 lo 70.80 25.20 lo 70.80 537.84 lo 68.64 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.247 0.247 0.247 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 70.80 537.84 t 70.80 25.20 lo 72.96 25.20 lo 72.96 537.84 lo 70.80 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.373 0.373 0.373 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 72.96 537.84 t 72.96 25.20 lo 75.12 25.20 lo 75.12 537.84 lo 72.96 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.498 0.498 0.498 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 75.12 537.84 t 75.12 25.20 lo 77.28 25.20 lo 77.28 537.84 lo 75.12 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.624 0.624 0.624 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 77.28 537.84 t 77.28 25.20 lo 79.44 25.20 lo 79.44 537.84 lo 77.28 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.749 0.749 0.749 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 79.44 537.84 t 79.44 25.20 lo 81.60 25.20 lo 81.60 537.84 lo 79.44 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 98.88 lo 66.96 98.88 lo 66.96 98.88 lo eofill st gr +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 100.80 lo 66.96 100.80 lo 66.96 98.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.110 0.110 0.110 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 100.80 t 741.60 100.80 lo 741.60 102.72 lo 66.96 102.72 lo 66.96 100.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.220 0.220 0.220 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 102.72 t 741.60 102.72 lo 741.60 104.88 lo 66.96 104.88 lo 66.96 102.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.333 0.333 0.333 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 104.88 t 741.60 104.88 lo 741.60 106.80 lo 66.96 106.80 lo 66.96 104.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.443 0.443 0.443 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 106.80 t 741.60 106.80 lo 741.60 108.72 lo 66.96 108.72 lo 66.96 106.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.553 0.553 0.553 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 108.72 t 741.60 108.72 lo 741.60 110.88 lo 66.96 110.88 lo 66.96 108.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.667 0.667 0.667 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 110.88 t 741.60 110.88 lo 741.60 112.80 lo 66.96 112.80 lo 66.96 110.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.776 0.776 0.776 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 112.80 t 741.60 112.80 lo 741.60 114.96 lo 66.96 114.96 lo 66.96 112.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 494.64 lo 94.08 494.64 lo 94.08 494.64 lo eofill st gr +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 496.56 lo 94.08 496.56 lo 94.08 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 496.56 t 395.52 496.56 lo 395.52 498.72 lo 94.08 498.72 lo 94.08 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 498.72 t 395.52 498.72 lo 395.52 500.64 lo 94.08 500.64 lo 94.08 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 500.64 t 395.52 500.64 lo 395.52 502.80 lo 94.08 502.80 lo 94.08 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 502.80 t 395.52 502.80 lo 395.52 504.72 lo 94.08 504.72 lo 94.08 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 504.72 t 395.52 504.72 lo 395.52 506.88 lo 94.08 506.88 lo 94.08 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 506.88 t 395.52 506.88 lo 395.52 509.04 lo 94.08 509.04 lo 94.08 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 509.04 t 395.52 509.04 lo 395.52 510.96 lo 94.08 510.96 lo 94.08 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 510.96 t 395.52 510.96 lo 395.52 513.12 lo 94.08 513.12 lo 94.08 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 513.12 t 395.52 513.12 lo 395.52 515.04 lo 94.08 515.04 lo 94.08 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 130.08 497.04 t 130.08 513.12 lo 360.00 513.12 lo 360.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Times-Roman fcd /Times-Roman-ISO8859-1 fdf}if +/Times-Roman-ISO8859-1 ff [13.68 0 0 -13.68 0 0] mf sf +<4b757274205370616e6965722c205a44562c20556e69766572736974e4742054fc62696e67656e> 130.08 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 494.64 lo 411.60 494.64 lo 411.60 494.64 lo eofill st gr +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 496.56 lo 411.60 496.56 lo 411.60 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 496.56 t 571.92 496.56 lo 571.92 498.72 lo 411.60 498.72 lo 411.60 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 498.72 t 571.92 498.72 lo 571.92 500.64 lo 411.60 500.64 lo 411.60 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 500.64 t 571.92 500.64 lo 571.92 502.80 lo 411.60 502.80 lo 411.60 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 502.80 t 571.92 502.80 lo 571.92 504.72 lo 411.60 504.72 lo 411.60 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 504.72 t 571.92 504.72 lo 571.92 506.88 lo 411.60 506.88 lo 411.60 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 506.88 t 571.92 506.88 lo 571.92 509.04 lo 411.60 509.04 lo 411.60 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 509.04 t 571.92 509.04 lo 571.92 510.96 lo 411.60 510.96 lo 411.60 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 510.96 t 571.92 510.96 lo 571.92 513.12 lo 411.60 513.12 lo 411.60 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 513.12 t 571.92 513.12 lo 571.92 515.04 lo 411.60 515.04 lo 411.60 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 456.00 497.04 t 456.00 513.12 lo 528.00 513.12 lo 528.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<31382d30312d31393939> 456.00 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 494.64 lo 585.84 494.64 lo 585.84 494.64 lo eofill st gr +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 496.56 lo 585.84 496.56 lo 585.84 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 496.56 t 740.16 496.56 lo 740.16 498.72 lo 585.84 498.72 lo 585.84 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 498.72 t 740.16 498.72 lo 740.16 500.64 lo 585.84 500.64 lo 585.84 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 500.64 t 740.16 500.64 lo 740.16 502.80 lo 585.84 502.80 lo 585.84 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 502.80 t 740.16 502.80 lo 740.16 504.72 lo 585.84 504.72 lo 585.84 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 504.72 t 740.16 504.72 lo 740.16 506.88 lo 585.84 506.88 lo 585.84 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 506.88 t 740.16 506.88 lo 740.16 509.04 lo 585.84 509.04 lo 585.84 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 509.04 t 740.16 509.04 lo 740.16 510.96 lo 585.84 510.96 lo 585.84 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 510.96 t 740.16 510.96 lo 740.16 513.12 lo 585.84 513.12 lo 585.84 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 513.12 t 740.16 513.12 lo 740.16 515.04 lo 585.84 515.04 lo 585.84 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 659.52 497.04 t 659.52 513.12 lo 666.96 513.12 lo 666.96 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<36> 659.52 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 46.80 t 107.04 80.88 lo 741.84 80.88 lo 741.84 46.80 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica-BoldOblique fcd /Helvetica-BoldOblique-ISO8859-1 fdf}if +/Helvetica-BoldOblique-ISO8859-1 ff [28.08 0 0 -28.08 0 0] mf sf +<53746174696320476174657761792d537769746368696e67> 249.84 73.92 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 178.80 t 107.04 384.48 lo 741.84 384.48 lo 741.84 178.80 lo +cp clip np +0.000 0.000 0.000 RGB +%%BeginResource: font StarBats +%!PS-AdobeFont-1.0: StarBats 001.000 %%CreationDate: 09.09.98 at 15:50 %%VMusage: 1024 36745 % Generated by Fontographer 4.1 % \(c\) Copyright 1998 Star Division GmbH % ADL: 917 200 0 %%EndComments FontDirectory/StarBats known{/StarBats findfont dup/UniqueID known{dup /UniqueID get 4092170 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 20 dict begin /FontInfo 16 dict dup begin /version (001.000) readonly def /FullName (StarBats) readonly def /FamilyName (StarBats) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -133 def /UnderlineThickness 20 def /Notice (\(c\) Copyright 1998 Star Division GmbH) readonly def /em 1000 def /ascent 917 def /descent 200 def end readonly def /FontName /StarBats def /Encoding 256 array dup 0/.notdef put dup 1/.notdef put dup 2/.notdef put dup 3/glyph140 put dup 4/glyph141 put dup 5/ch5 put dup 6/ch6 put dup 7/.notdef put dup 8/.notdef put dup 9/.notdef put dup 10/.notdef put dup 11/.notdef put dup 12/.notdef put dup 13/.notdef put dup 14/.notdef put dup 15/.notdef put dup 16/.notdef put dup 17/.notdef put dup 18/.notdef put dup 19/.notdef put dup 20/.notdef put dup 21/.notdef put dup 22/.notdef put dup 23/.notdef put dup 24/.notdef put dup 25/.notdef put dup 26/.notdef put dup 27/.notdef put dup 28/.notdef put dup 29/.notdef put dup 30/.notdef put dup 31/.notdef put dup 32/space put dup 33/exclam put dup 34/quotedbl put dup 35/numbersign put dup 36/dollar put dup 37/percent put dup 38/ampersand put dup 39/quotesingle put dup 40/parenleft put dup 41/parenright put dup 42/asterisk put dup 43/plus put dup 44/comma put dup 45/hyphen put dup 46/period put dup 47/slash put dup 48/zero put dup 49/one put dup 50/two put dup 51/three put dup 52/four put dup 53/five put dup 54/six put dup 55/seven put dup 56/eight put dup 57/nine put dup 58/colon put dup 59/semicolon put dup 60/less put dup 61/equal put dup 62/greater put dup 63/question put dup 64/at put dup 65/A put dup 66/B put dup 67/C put dup 68/D put dup 69/E put dup 70/F put dup 71/G put dup 72/H put dup 73/I put dup 74/J put dup 75/K put dup 76/L put dup 77/M put dup 78/N put dup 79/O put dup 80/P put dup 81/Q put dup 82/R put dup 83/S put dup 84/T put dup 85/U put dup 86/V put dup 87/W put dup 88/X put dup 89/Y put dup 90/Z put dup 91/bracketleft put dup 92/backslash put dup 93/bracketright put dup 94/asciicircum put dup 95/underscore put dup 96/grave put dup 97/a put dup 98/b put dup 99/c put dup 100/d put dup 101/e put dup 102/f put dup 103/g put dup 104/h put dup 105/i put dup 106/j put dup 107/k put dup 108/l put dup 109/m put dup 110/n put dup 111/o put dup 112/p put dup 113/q put dup 114/r put dup 115/s put dup 116/t put dup 117/u put dup 118/v put dup 119/w put dup 120/x put dup 121/y put dup 122/z put dup 123/braceleft put dup 124/bar put dup 125/braceright put dup 126/asciitilde put dup 127/.notdef put dup 128/Euro put dup 129/.notdef put dup 130/quotesinglbase put dup 131/florin put dup 132/quotedblbase put dup 133/ellipsis put dup 134/.notdef put dup 135/daggerdbl put dup 136/circumflex put dup 137/perthousand put dup 138/Scaron put dup 139/guilsinglleft put dup 140/OE put dup 141/.notdef put dup 142/.notdef put dup 143/.notdef put dup 144/.notdef put dup 145/quoteleft put dup 146/quoteright put dup 147/quotedblleft put dup 148/quotedblright put dup 149/bullet put dup 150/endash put dup 151/emdash put dup 152/.notdef put dup 153/trademark put dup 154/scaron put dup 155/guilsinglright put dup 156/oe put dup 157/.notdef put dup 158/.notdef put dup 159/.notdef put dup 160/.notdef put dup 161/exclamdown put dup 162/cent put dup 163/sterling put dup 164/currency put dup 165/yen put dup 166/brokenbar put dup 167/section put dup 168/dieresis put dup 169/copyright put dup 170/ordfeminine put dup 171/guillemotleft put dup 172/Tom put dup 173/Pete put dup 174/registered put dup 175/macron put dup 176/degree put dup 177/plusminus put dup 178/twosuperior put dup 179/threesuperior put dup 180/acute put dup 181/mu1 put dup 182/paragraph put dup 183/middot put dup 184/cedilla put dup 185/onesuperior put dup 186/ordmasculine put dup 187/guillemotright put dup 188/onequarter put dup 189/onehalf put dup 190/threequarters put dup 191/questiondown put dup 192/Agrave put dup 193/Aacute put dup 194/Acircumflex put dup 195/Atilde put dup 196/Adieresis put dup 197/Aring put dup 198/AE put dup 199/Ccedilla put dup 200/STARling put dup 201/Idee put dup 202/nbspace put dup 203/Edieresis put dup 204/Igrave put dup 205/Iacute put dup 206/Icircumflex put dup 207/Idieresis put dup 208/Eth put dup 209/Ntilde put dup 210/Ograve put dup 211/Oacute put dup 212/Ocircumflex put dup 213/Otilde put dup 214/Odieresis put dup 215/multiply put dup 216/Oslash put dup 217/Ugrave put dup 218/Uacute put dup 219/Ucircumflex put dup 220/Udieresis put dup 221/Yacute put dup 222/Thorn put dup 223/germandbls put dup 224/agrave put dup 225/aacute put dup 226/acircumflex put dup 227/atilde put dup 228/adieresis put dup 229/aring put dup 230/ae put dup 231/ccedilla put dup 232/egrave put dup 233/eacute put dup 234/ecircumflex put dup 235/edieresis put dup 236/igrave put dup 237/iacute put dup 238/icircumflex put dup 239/idieresis put dup 240/eth put dup 241/ntilde put dup 242/ograve put dup 243/oacute put dup 244/ocircumflex put dup 245/otilde put dup 246/odieresis put dup 247/divide put dup 248/oslash put dup 249/ugrave put dup 250/uacute put dup 251/ucircumflex put dup 252/udieresis put dup 253/yacute put dup 254/thorn put dup 255/uni20AC put readonly def /PaintType 0 def /FontType 1 def /StrokeWidth 0 def /FontMatrix[0.001 0 0 0.001 0 0]readonly def /UniqueID 4092170 def /FontBBox{-12 -210 1083 917}readonly def currentdict end currentfile eexec +d8061d93a824650eefe2785f13cd28a8a226cfb0a1a9915b91e00d2c2cb80ac548a1ab21bed4518a56748942842eff6121b01bc269e7837046266cb27dafd3a4fd0344e68245aa98a5f1b5bc9db554ebffb879f1c082989cf6c044b76f4814df51dcd03f9e3397f3c73d94f85771983bd52fbe6ecbcd9a2cbb7b3636cfb819daa5469925fc89a188732d68c6d06c906d183cb4bd495aed0c41fe6b7333ad90a1674478062c8996476573a0cdad62593c86e4741ecab7b8c75a6bf02971dfdc2c5a2e1c8f74ab1e91315c54e72426da3a62dede611d5967201fe8bfaa5a21c612c0b245fa35c6706b7b9aa3f73ce16604e3109770d367fb30fa663aa8d2b246de733d27174a0b818d54c58c3676435d43949eb9e5e335396296bc3f096fc154616c0b723b0b4a100ed45072f371f77f26e02f1dcc41376638097d79af0a4ddbfc37dd6cb60d0d34ea5a7536c655d95549b8a5a269e7e927c3d89f74b88e17973c2e8d64688089d329abe6b1009c0334d57a6dc34f22efdd933023231fa03fc81093ef255a199448f17d8f67dbc57c38b2fa163b8cef97a6f42e74af55319eb81a6fb9de18810ba9e3659a7144b80aa066a9f386de3030fc4985efffd13c0cab7049a09a71dc1dfa21a1540f4289b13dde08c0d3b4a01fd2bcb4e256b398c94036935bc270713a24c51042bac575ed4827e17e5dc2997753fcee0ecaaca582c85518edc0c3dee2851fa4d2581f7b399f07013ca3d1d4702cc27be134cfa8aa1cbfecac76f1b406b5b3126c3b7b60ec34340aac6433997656b3dcc1af6c8036f051edfc109a493243546721683fe5c0e48790848079c74ea0640c3f9c92cdd22fab8af9b5575a5d1d2cea0f1f715505cb02a1e200cbe4ea5563d0475cb13bda929286f9c11eab10ddd676314996954ae3c94bd14f364d5202e6ddd20b1b4c7abec1c061b2d8a1776577387a2f2dc424f56d44e58b96f91f7b871627089498d76bbc6664e1ebc9b26486cb727d4a5d62fe405324ceb0a5dbf51c9619f2913e4dcea44c5bac49d74bd049f28b83955e13f0fc77d998a307b0bb560757b21e4a982b59cd5723d66952b8a7ad0311ee6874842f454046538c475b86983b4b8d9c00e814009235a058f6d5fca9e8339555518ba2b64ee925cf0944deff5c14069a1ee1de2cadafaa6421f495c21c042690b3a7c9e6a5a137ee005240308e63e0b1d4bead90ec607d19c57ecc24c2ea9b8ed4af8e5ec19575ba230c19156ff9b23915a7b50666ec4b655a2946f97c5013cdfc31825f2c1040fb28bb8876b1accb1fc005010e5e5d061651dc9df17b7bb37c495a37df9659962680951290f3f4168dffb294f83b2a3c423526a97451e2504fc0c819f4d263834ef7c8588ea4d68c98eb5e3ee3c2de20a6da219b3256400a7c745059581d33158a505d5bb07c75bda324c2d8fe34eadb98520c7b82838835e92ddd1d89516478cb1ca795324f802e1f7a5547f671588fc3e5b909f5ab9d573bb0766569a36e89586b7410b76867cad6577022e9be567d1a5578361d83b817fb994758c679fcfd6b22c9fa7c6c76f2a72be566e42167247c831f826d9a10e03874b9747783adece88750be1206a07923cd9fe06b677b61c69a7dd9e0f9dc60771ac529f6adaeee9ee6652cdeca5789c7f242266d86f0154a1984402c720adbc3dc79b6eece6d378555d78873844ba1cf057f385e70474132e0bdfabe169a631e07d12fd21f18736013499081e58d72e9cd451df304a5bf52c1f1723a5ec8b7992d8fa3f33d5be97d4c114fd435a94607f8be09812bc1fa4db028644e2fcef5d86ffb947a14993a93185b054a7cd9ad734c62f2d9ce3c0f9e2e8678bae5b92315f60169aa85d4ae22488cfab72b841374ac3f39966b9e126ad64c0307b54085b6e25d51caef51fecae4c5ddbfb5c29b15cc90ec0795123a84d3c31173b49096d617707d9e192da82493ac9884759115c02ba4686ed464d523aad69167e24e5303ac3eb3da0eebcc420fdc256cc26d466f979c8e637344958f02ba9d3a481693fbf13283d7d276af546abf2f2bb4e6c6f835c97e532bd5b40e8b08eea4441e8a9e03021add36c4fe28180ea466082e4fd7facb03f7abd47c929c4e0d84132835e59f8276ac7fddec7755cba924dd1c97e02691f13f2e159b1e358ef2ba347e2298b0b39f5ffdab57daae22d94ba5064abf716c866b64add8e3981b76a77a3a8be0a462594b9e1257e7940b237875e000c0e23a0841a85da6eb5af931dc0ddfe912285d160f12a66ebc8717fd37c13d20cc132218d31680d596ffbbb2f2805fd931c61693bcbe365f0d19c8fea4ff3eceefe09c5e29b7fde3782b8adf4bb1aa7f89ce01fa59d1322a1ccc4d92705e274bdc287312b23ab830968143efe12c8d4ac45e0c72c11f630eb5ae0c835b7f7d32cf261c20f04b7df8e362cb15cf38c531a3988afc8eb957fcee0364049ccc8d8a6935200970293486bb69db1969a2aeb39829cc4bed803e0c266c77b0dffd349ff9ae8f95558a3977775b1bc2dba5be54800a9e9645155315b062d0b5a0491cf90a66e84b581070f30d5796f71e88db0352432e8df588d25c9c9b2dd12b976618551d5625e357737966d9a15fe3cd9d54bc275b6f5993ecfcfbb373c419e2f8ed32fcd56d30db1345987a445ad259e03053244a1ff80c9343538c74845a907b0480f013289cf475df6c989a81aa5ba904a63db328292553fd4fc3a783fb76ee6ae50be4809ea0aaac9a9ba429c9990eb45affca8587972c54fdd677cd14f81404c77e4358212f44826316a927983c968767e7be1c7a36f308b6cab1648780b4f1a568cbb0ea49f6a6352d6ab18d54d442c176037ad16e18a17d88cd8fda7e86895c89368239f0f75f8c26f850316a328c40efcf316d8829ddb0fb69b250e41b94144e0475acadf63e51f27f6ecb6af4ed78ddce68c055b7a1f78ec1174bf9d67f54838da11655980a909ae1b80a2e6282137c75e49d703e6d5b4be616e62b020a8d08efd14912337a75857920f1d3515ab2771d38d8d8f610c9801d0b0c8d3388c75d211ac4e4c0c491d3b70e1bf1b926a6fabf60487613e76e6f779c4aed60929561ed06c676de7d5052f60db62e446ca4e2775b966f74a2ab55466ecac93c65e48d5e6b88080f24534ca63dd1e6781920be3010f3e9ceb771c5509754ebf963de75b4b9c9116ba7f4e21d9d89d2df167d8c5674b2fa61f49f016b4269e602c6e144de4a382fb7f185dcd82942081d6362f335695587d2ed1071a70bb27d51200a1de03763bec6b2c7a86d8f200505c07f25fc6be9c044110607154cb69efcbfce495dc86dc634e20349712d3754ce99a8b33cc59ce272e39f481b729c878399e51976652b4a525d107ebbd809909ec95f07f2012672601eb9ada5e0b3292d68b6ff8d529a2dcd23f7150d77ba5b1a36701d5954d37ee96501f9efa8e037290f6dca8c024ec0a2ced95b8dcbfea0ddc55dac8ffa55e224d33fdae74502f8f0085fdb5d6d031d34a609db4ed63ceeb285f3697049800bd560e31bfdc6862a49da0ff4b4e84bac9f184e08181c7870058559f826977e851f7dde09163b8b3cc82be8103f7baea3072202ffce888f1bbe37cadb748e2a3b3b53cf38b4336a4eadd0afffd76389b1dd9d067888c4e647b07a7643b81fc08a15872f08f6295eb45e7838021253432f2bdfca6c2a85aa70efea06863d3ebfdc555f41abceb6fc1a5f92448e917ae97706dc04adf0b7bc817c1b93d2f924b118fac5fe6053093401a4676c6d7ce7b4ceae1f5c149b1d8d712d32d56bc8430c210a7124e192e387ed9696df38ac2763e3a065c3ae4726afe9c16b07891bf5243c16add2bf494f9ae8b7566d4ee600a7fcc945d4bdd305daf4df51b1c0222e5594c65af003b51549e0e790ef194943d4accef39419ba173d05788ff822d4e3d4fb5a612fb13292aa377e50a44a6953bb793d0c521c2179012a882b74ece2f79723fb75624ae9c446ba358a3effd738ccb59a856f1bb5afe8635e1033936d58da18ea1f7464758e4647ac03552bcd1be22ef9d4c0f4aea0d7d1c91234ac50d5192bda73b0e63a8303ee284009e6f42c0a8671cbac1c02ac67f096cdb67e83a8d3a8b0e2915fe4e498d50a80892a374cf637cbdc145c2a4a16e0449fd300f7f03b9c80b320addb404d3b7388e5473a6502c74a9d614b21f2526b2e4f9fd9c5adca0f01677b57de5a55d60d9c428c6833d7abb14514926e09bba6b07763aad75d0a934b7c44976be43c289fb238aeff7556183515a5c4b085447922adff5498d29e101a60ff02e893ce8fb8d446874914eb3d3009db46a579d14dfe884d22d9ca5bfde436f4bf334c8c8e73cad66d26b9b711b3a2a3ea84d6864945e529bf59d397ed0acca03a3bb32e470c46cd6639cdae83b4e8e6decd2e8574e1b9361e2600bdccd6c9231ddb2b5981f4148984e0d21d2bc7c54fa7b32144192d32a60bb17520e855b14ea6ba31068d4e209a5add8dd6cec44932063adac2280f985cc70099a1fffb3cdc3134604bb8e50ede70ce9db412a309a21a0541662050f545cf6f2fbb39e9106e83d34dd1a7f9f08b66e68052482a68778687aac8b793ca24cf3d258d7991c4d2c0eb760d1b83dec08277bce87bef9883ff7af63a927a509eb44ffdf2f8f2a529baee6c68478a1f8a10c81fc3fe0a88004843f05d15b34d04149508d7b29ff2b11ad5e150269dd78545f0f57ca1752f6197a8539ab3aef587645b5dda3dbf18060d30c3426f2fff04d9bf22f1591762597d72cd6225f01377293696235f084801440fb9590bf6468e73c11d7de5c7c9899d6a84a9bbe18c8238e117ae4e74ce9c087957935630399f186f4712caa2775ee026f1c9f334bfa2ea897f2cef8f6d2f200bb2fd7d9292c056149cb3091d54be657c5efb690dd7290b7f866330d8b64cdb134019ba3c608bebca348fac2ee3891d54ce18d427de0e8270ca0b19b5cb9ab69ff7bfce6b5c6431fc794f1a2ae04975dfca6d865e38a85d0092b339119f43ee8f11f999ff0132145ef65f2786d9dae9c45dff0ff2195bfc604db64e4da4b681dcb6a3e2be4f691bad02abb6347e7ffb00172df452182679d10029a878d14569825c6df61c229e158f92a6a0e0590722313729ecc3c93a9de9f044e62d3abdf500ea46557e90649aeb8cc582bfb6fa71042b330800d50aebe27e1b7605c3aca1f67c4116d93a1d59d7f9a9d7dacb2c949193b0e901291474ed0f6b746c680b337ccc6adcccddfee2ba9e31f588940931c6d697222b14220ece34f97d640f78eafe33d689d8c5e94ba3eaccb197728d58924f1325c5951246898b2477057915ce4caea524151e7f3cb049441ae88014b89fe7730eed66c4161b2e01d608d977d674edd37527433214b40081ec8a262da3f69f07dd54acc3a8dc5058a927bf7ac5d3ff18e0e526cda9eeacc331cfecac11d2bec5872fdd5cff5f7459a42f263304294b139fd7106149b962873b757a2db3ee8e030a8ea3af3366fa5f3226d9f9de3c48dcc0f701ac74385d2b753e655804a834456e17ee576872bb5e9815bd6ab6a4555ce5fdcfd0b1637357424813dfa6443a46200dbcd46f7a15d342c14e5b99c1e53953283d83e81311eb2537162005d2bc0f18b336e33f7190d4cc4ab8a86f596ac2522b6fe3aec0befaf024e35f811a309c8a03734e432ac4695d977d6fc14c93773edfe0eab4b5a0a6d55b4ccd205086b92107a434b119d15f145d0f3511f823e69a4b3777b659555f06116cd99075982c200e36eff85d7931c7b918af5504bb4129cf65c8a33964b3b6fd3b2340fd3737c73f7667632cbf81535b88096e99a5e98ffee00409948eb2b46010a275ffdf345bc0e359ae4c2b6b804a36ec5018db1ddfd43ed28e0982be3dd61a41fc78221bfaf4eea3c94e8819e2d296a355bf61cc29ad69e2baa9caa77f4587be6bccfb178d553bb99bdf52716e6a8e2626505b819cc595f5173d13340fde8dbb4db3313a66348c8cf5fddfe7d7fd04becc8fec0ee1385ce5329088e772f1939fd59e2dce71c2946044fdcd131e06695ebfe5ae6e512640d0ea79492c20880391bffb1b3c9851cfba1b5b16d5860baa2a2b1f4e0a571aa3551cd73256e171c2590687e3596108defc56ca6cefb27095380b0bfff828d897c5f4a1f7710cc1fbe37ce9254c27edb772093e789a7e2a941d676fa8f14edf641dcb06fbd638e74a3764be77ccb7f93b5f961be59a6df0c5305b6ab3a20ead2d3eadd749fff40762a25833c9efbe377d2aae40b18e7785a77f9eb4f05f987ac7572854859f5fc5f56240e94305543baf5df3fb905a1122d20d09d7133923783f4d1e30ce9bc990e1d4989280cdcae75b5a78ff48ec68254373f9a57663255c0d5a18bc78b3cf2002befdf0cbb3cb5e76243b963e16ef7a34a06016dbd728117ed141ce213dae5acc96930ef9320938084dec3f77ee4e595b496648896de03deef6fcf49f6477a04a0b190fa668ecb8dec555db55d7ba7d0151042dd4f205e50f53ca706d93c9ae1b67b51989ad1b3ebb27f2416588397429d2129bfe0d5fbc7888fe0ca49754024224ba6fbd089214122d5c5dfacf7fe314c34581b80fe2f0786f7a70788a1dc27bce9f69daf04f197e9fe3f735a339f6f88067636e23559d1a02cd1d8b70fb07146532a5b404a4491d8650a22ed0f49088e86054e76656f079074ae121f5039c5a128109551c3ad7bfb874de16f639a82f0cae1ba1e26cb21bb8ab0ffd0fdda61da950d00e9a9d319c32757cceb80c07716cecf71f96dc167d760bcb54c8c41387d7fb8b5f884a0f7f53acced99690e1316a8f2005edcce538b3b511a637736a08c932fe9f54e281535c9ebe5716228cef9648813df7f0ce70b5107833eb4025e11f93aa574ca8215ce3dc6a5069f03f22a2224d9d2f8c819714b3b02f32066785f9aaf616afa69a3c031f1d1ece51d541f60d6b8e739b63b0f6472b93e5e34cbca3474b47deec1d72ddf91baaafa42078c177469e8099ef4a80758225c7839a0ba643dc3c88fb01ca0f278f077675f0f3bf3319931f129dbd9ef04dd0daa8cf8bc6573b6b2091b64326a366df67a739f27f8c20f47ea3bea9a9880b0aa3b558c56f6596b0f51b124b78b717336142cc03823f2d75c0ad84c09868cbd0dcfae4ccf37b345a26d5e08b20c36505447042ee2ce81f450a835d7e0b679c0c9eae37ef6982001a8c52708c5db0ec2294a90b9876eb789ab09af859a0a879cc27d2f52dde9e9a6960fca2530244cc26d3a21cb294458d707dbe2441460d79d1783fb334a3d144339bdd635b676a1b260f5969bf089d59a526f56bdcf92bbb2d52cb268ccca6c66e4ceefa57c72cbdf8a4e1a2b57ff356f8fa49db680fdbaa3d4df9f1d6201307a44a9ebef9ab8c893518d71beceba645d6df155f6aa68163f8d66b40c1084b673ac16b287f763d40db303c4c9f9e76a3e8fff77d595e97f7e59e56b02aa8f005d0c6830931892207e25a11520efbce320b99362de47e093fdd48318cef9458ab6b4093d1480ab1424e82695527412d0c5e3c299eac02b67ee503a9d04d31431d172f50666fa59e778dc43ffb7eb3f78324a5cd88601f7109bf3bc03f0256ec90473715c9a626a8488a4ac0403438c7fb97438334506f3718c262c6fb671cc1501e1616281c50c1f1abb0e796b5a989d9419e9146784619689562ee006255b58c5030d4deb7bd4e723d5dddced22c58905adb6a1b319ff10a8610912023c965c87e8b9f50babf746950ca2b356c1a9cc1cb8180a3536b2a639a147f65a8178fbe711c5fffb8fba62069c74e02ee7bb219bde7f581ed080e33ada55e37013823fbe5eaf8f7b774209a75b047e7626b8b82733f525e57792ca6c79bd882c5bfa323fc5ed98227c892ff958a359fcf654cb8facb6827d717a899ab9b4d2093e7a3762ba0c9f7ad55124173a5bb29f9f8769484f698dc8f8b394816dd74eff3b1a7dbdf16096bd0ad1b5bd409d56783b6d418631be43d241d6b834e1e8107bd9e296f9aa43e90ef753d6ad527875f230f6b1d3914692840fd51e8048ef5ecc8e7d2da90645c8e0acbdb3803d677cb07714a5fbaf0caa48234e6abfd0cc1be8a80ea7e956ec40a54ce712c979d9d108c28566d3c71c93c25fd7c202c637aa06f1baa00ed6262f87062cbc03e7722983a7c87645ad8d6e0df84112139cd220b03e3b874dea9b9705efa254db06927ab7951eb72ea84b253e0bb877b77fb1810b078ba9f20280d7e85fd9d134ee7166cb1cd51525a5bde7cf96b26569af11b40dbf5b4b25a662c9e14dc084cc349bf451cc976d1de3ef735d001c18d7e6027fdba88d29016ba395ab7f6b1d232151acca1ee234a287c2d7843223db3df6e3e5325a9fc82d92b0baa4a28fc927a3c3d307f7a7ca1ec7a54e8b4a56c177aedb633425bc7676a10c0c2d51b5555f4757c2c9908cf39eee8f85913216c5df40fc6a04dc460e99f55844700b4e02ef7a81ddf4bfa798e5ea327d2c66db67c608afb6ea5753ade25c620d52a5ff2c1d43385737d41e7e6cc645b1f9dffacdc0e8cf72a9128abd66cfe77f2c273e7efb2c6d3ddf4848a023911b7287797cb7a3baff8df5f4d8baf2d30d8ef3daa330fe4728f2fc405bf82b6360d1c9f78d17fe13bad721756ec2bba578702ab8a41c094b22a2ea393e9d4d597e5d0c2f12ab5f21d4546ac61e0b96ad5bc47586bd42edd8caf964cd2b997e0bd816ffd593d5481a8ab543384f8090d7cc0d9d4dba9001992366bbd61949f2b33bb6633f45554e879ec6399f11a13be5d195c927f9e4fb503c2f7f1af69725add00166a3c6f0b72230416d09687ac6109eb06d16b8321ab293cc112cccae7bd8233a6206b814694eb0057b708a76f7c793115dbd09b6b6808cddd0dccbc2a20c5abd02a91f0846ac0856a5cf7be1319057e48631937a3bfff2d24f0fecb55e929c1c7d8dfddf2fb892926e20c9fe4a84bc1d9dfd203d438a7f989ba23836bd55b1089bcaadbbbf19e8cf001f75059a1dc3daace5ef08b0b55231f3b63ccbcb50805601c86e10e48f90dbae123b55d421df8301a9c67f4cdead045d1ace302b93f9337ada9ed3ea36369cf35577e868383d69cd425ece04e0cdc1940b296c35e1314d837d6fa900d661eed125ada136ae005179a03494e23a245d96e60cbd7a04f9503c227e835e58935e28bdba5446128f0db08dcd9b85049c5c67e357a3a511f37a71df23c25f971df40b9982b1b5ab845bd4870fbcdf4ea319afa2e225dcbe3b4b06b73429467ab402aeb48e3b661a0355cdeefdb754d43b66d1b576a1ec93994587b16fef1d493d53263ba10fae3dd01736b479e33dcf87dd9af58b353bc55b8a5382aff065773ca8e932d8e55a80537dc04193176a1c38082e3d4fbc38ffbac68bfcbd80ea1682b79961ca070d3f7938571303267b2be5afc70f196383a01fabd8952db19f7c5921fd66ef6f44523adb1bb09ed0cd03c14b8fa91b088ecc5152d6e288f2f388b5870733b489081581fcdc2e1483d3a2dd9b1bfabe1732b2ae37041d49727a2bde007820f328cc2118b610793e6a6996e1f336a061eef6b61120049fd0b9f0847409cb3a8ab404c563c1769de2660b073dcb30bb916f3679b5819958ce2f5330634e2361cff5c0915861ec791b0dedf34a845103f7e1041a366e6109b88bcdfea2e0d0d260f16717d67e20c9a0b624f15f1f05339a408dbc7fa3b8395895bf50691bbeaccbfe69bc22e136a37fb9d074d668eaaa2f98af8ee35119d46af0dd9939462cfd2ddeb85792ca7d38d61e2c5109d2c91fc8232503900396ae6a85b7a88c80136699e77c0d7408eb88538cc544a3db250e2bcccbfa8076d70b026d46cefa250c128f8ab95d1ed9f028d56b01489d81da013201747b80513f318b84fca9dd1c4d65f36a82d09d847d550e1854341338456714e0a93424e6146e34994f84cc6bee325ae41d716920dcc0bfec62368546c901a8d43bf94c9bd2cb56283888ca54b758135fbff776c9fa98d50271b172889414b7e948180c03700d2cf3ebf390f0f9c8985900a76be9171f7439c60e18a0db5a46983722ff1489f77d24f2112b9035e65cfd10fe4c560426e464b6759ae5f24116d16f9a3167eadd85389114535f44f8054d463c1b8bab08779d40b74ee854aa6d652aaf40c30d63622eda14aacdbc002c0891abcc764b676a3b049deaf49d6789c7f9cb12bb6f0d1619548bc12b6df69c98a4af5b085c76966b116d6a2cffe4a00733efe59a473985d5602319fab0f04dc3a55be53e9c87726d6ace09dd8343e3e111858a3ae45b35de08b1730fc628265f0afcd3924b9c143450128aaf68f41fd5bd4aedfaa9411bd33032a81405dc45005c62b682112ce0952e1926a47571a8790d639580797e33f991aa9c0b7178448591f044dc794e31acd413e6ec84b3ec0ac0df66e08e9a89727f91620f3f18f9238ada2abf4557d72553f01bebdf62bdf5742d25b47def93114918c643aa2bf8761441ba5e6699760f9370b5c29545606f6003e4c6e4725dbe4078b416022b20c1d2aa30d0dcbb724783777fcae6d2487bb793e9435218f93573064f47408d08a9c39bc44caa91c24177e8283e59cb9be2c46c5329b150478beed8c6e1e35bf56c3becbcadaef963bbc70128a1518c635420921fb37e2252910e270692e8bd641832740d67f2174ff3171ac73c23512bb0682a305899af28fce475f399ffcb310dd96cd469fbbb7629fbceccfc497fc2e469a14943fbd5c4d24c8c89b66f6638daa38cbf9dcb49dcf016d768acdf758356834503afa00b7f5c8116e147c5397c2aa8ec8a241bb2a5dcfd45627821a79dee1ad9b162796b53c59e3938c94a2a531b737b7d108b9f1f42a2164027e7d3922858aa7931dc0f7e0ec8e0fc30c27d4722a4d083115c916da5976680da42e3a7fdbcb8084abde4d1f95f62a2291847c4358cfe83b13b9ec2f1378f75f787b2b573a027b24e9eb8a47188be809666df8772e43672f910eeb1c23355987358a1bf34c3a88c2647a46eb85c1429e2e5123acfce3504e0ccf4b89e9b3de548e2bc16b8e765bb53568070a17b23aee93b0988b67e10dca6129f19083a22e950a6beaffbf958a232d2b40a7966f96d8d6c1d30d4e9d42ee28dbcf0bfde533a8b5c07c32c90c634bbb90471c53658d596fd066db06cf96e76f5563b2dbf17c284fb88a7e389b9340cb17c0707caee7791234d4b9cdc0406a59ad5aa3ebe06c7ac21851139171b188bbe7b43422e3847e30014dc2f4966126c2d23e1d54d0db34fb2f415347f14ccdb4f533d2f4ccfeae45f21b027cda966933daa5732464d7e125f32b05447fe1d15170654b53a5fc3ee1d2d8427096d1f71f2bfa3e240740c879ab752f0b14d1d17fd880f05d65ff64a05bc08f69d97fb63dd78346b9ca038d79764cabd013d57fb3506d4b0ccef1c92bbd704aaba9cb912e6034ec9ab77210531c9a1266c272ce3261dde19b9a574fe5a7a031416011100ef594396adaed9f884d18173f0fbf256e47d5c57a47864a3d592c2324c39bb6b9f8cd770e23e5884fbfc119eace855f4f21356a57f912c9e27fcd292534cf2ce0e0490aca08b4df6a3faa614239252279fd2c3df91e054129e1ba23fd9b7a90ed0cbc1f9f8790ebb11bec7b0b07a228054e1f8bb4241ab3a66bb6a224bafa455ebf835e5cc1b0f7701e2e64190091a577dd835afc77e72f3970721e1b6fd64ed65abe1b7376eb58e3273254b2da264df7a97286ac43f1c55f1b50710f54cf02da4023260084aa143dff539c5c7d5951767d0ca6b48d5ae8dcfd1727774ad1c5e7273c2aa5076c0a0fa3ff8f1bdd088fbfc17040808f3bbaa83a228b573694aa171d4fcdf13185e0a010788698eba537240a9ee729d7af975b4a8637901fa3aa401cee44a0940b4378ec67b101784d07fea844a50c542fe2a3e01bda791c2ba0ea9879bb298b7883e1b8ee13a88f9dd3b28813baed3f97c29bc8b9b2a0bdfd03df29f826498abe20f8bb7ef6be2930377c56430b7b0ffafa4193998c32fb12ab1ff63695a3201e227698fa8fcdb065c9c3a82d2f0b8a78ddc9afd5a1c5b135b019c22a46d8401559149293420d91aa98397741e9cf6bd30134bd8b5f3c5a1889e5cdb61aeb0f8a052417c5dcc3eda52fd90b2a8c2ade1a0cba31ccc88a78e1573f68ec6104fab6c417c631e90bb9ee10daba4cc047ce30b2eb735ec694521b7a87edf3e15fbacc941269090845894eacc56321d38ebd3bf3bdcffe80e3b21e4683736c81a61ced165e3a2fa10b969ddfa1f55d340612e7550144aa43868d2ce06491f2e5e089b1fb3880c17b6040343b795832e1638791ab2d12b1df0ae253aa1b3e9fe01bb06f7f306c7468bdb397cf4a9977caeb0a3c95adcceb5161f95c985b08d5d703bdd011d2d4a38f16795b54058fa2183ce076cff0762b3ebf56d8d8d0fafdd508449a2f5b0a8692eabfa509dcd0b38f09f4f99e56a0044c61c067a107857dac52e1a364ea053dcb290a7cc1c78420bf502fcd56c804c8729871aae4a4752eda8c1f78de3419afae90eccdc7572a00deb5e1a90d1b8676ac638f011b18cf42c99264d350b77a64a09c433a470f3a2ea988348f59abaa12a1384b0558890e955f1f385c05c740a0b44bb51e9cddd91bdc46c8804eca94cbf9e0fb0c18b770b70f81fe5c9c6554b3a781b22665de565d08fe0b3bf6a57943888d387c19c296827e60eb6b81685016bd1b1c8d95b29eb8c335fd76b208dbd5054b22e1fc0ab4743f7b95d623ca64c9f9afd5285978bc5635a54a70aa16e736372ed027e9518a4d0d0f9951996b210830e6d46ce43272dd0923483f986349321b2184555b6a6573bced5fc778d682085d1970f05cdbe85c936a4634c9821776b4ca2e8dbadf3715228a73c71aaa271ad02bdd76a00aca5bbd2036ef7bf949814e76561a22c2f2ebcc43c7f4af62f5a40e2df2ba612e77adaf6715e1c980aec44b1164ea20020dcb5d9fb7072052e733a0a5b69d175ba8cf48b780b371575e490571e05b3fbff92f1e0fb87abfb18f4f81c8838d5bb155942adcf8911fc3926a22d60bc9037d8eb026ea975c00937d79432be5e791ff1265b396443813020ad11f0e0ee66bcc4d68aca9ebc2b4b8aff28de824007d9d9d00a12ee894e55c565f957f5f0cff21e1219c0badbc99de37c17efaabbbdfa903ca892d5a99a7201813a2ca9cbf7b5d19d779c82af7a1be51cce30ff3820448d2e10b39154573358bb6376ce5413267f6de7d7cfcb8d4d9aeed7a0f6648834b1452c58f397ea28dba8cadd4ef29382d757b78649c6436aa3e38505e1543fad8d22a415f8c0b6afa7bf16cbe0aa85eb9042f0757c8f3ce4e0d432b2b0a328ab69529c5f8bf8da11b0b354858df07e4644aeda913eaec05fdc24b95f6f4307741897662f347ff5785bcb06c0aca0ea708cfee767f385962de34b05f897242256c1eaf5fd9382fa9f07c3b2acc2d0193cc7688fa71448b4374cc3805cec6e7b503a693be2438fb03037d7a70088dc9fe10ac37c84d29c8b5f04648bc23c998872af1df21a88cee43d52ab580248f6d11c0896d25c4ec8068afc138518f52a23c9c8ae8dfba103cc49368a2ba7a6111a8d0e154d007cecd32d9a71c3341ee238d7664d39a263ce2d5efefe4065c1654c4996e5eb10397d78ab6ad8155ab5c815707655d2a85a00187f8ed16ca19f0fbc8c116417420666e9edabb192cb81fc6e2a4fdf00bcbe0ab582a63de69af3d7e7c6ec7f23c09f02a81a221ca2d2edaa751bfd3949ecc3e81d6f518453b47911b0aa13ff53dd8a4af4b6d8f40cf4ed2f5c3e700749aa3211aab791b9e9e899b4e53f3cf1d1c62bbdc06ae2ac394be1a9694858919da321123184a8a07d01e084655b974e8ae6919709ffcc4826f62b6a5dd420b784eb881ae6e682b292d2e575a28eec33e21afe2fe17e024829ed46bb4babce2e65d97a656feae5f5bcd3f10312a5a102bac3e502a468c382349d47b6e7fc4435a8c56d61ca2c33d93ded9f2165c1f640cd23b0f36e64adfd4c5afcba0fe8cab87ba2040efc0c2f00d3fbab933303b1c34f15a60158e5ebf5c82ed18c84c54babe8e1e4910921d3cf829cad909acef813f174ea65802614fb567944b14630d1e4b063c49637e7110a2ca6de4f34935866b3ff0c3643014aba7f8ce5b2701abc1e0f9caa048e7d8fb937bff1c0319a1de8f126a16740d7f0a8833b60b56864f98ea428e2f105ceff6dd30a16bd24da9f75dea0f4ce864bd44bc52b73057527b73f35a7f9e7bfdde6435e68fdd781e82b69b22c09b139b35b5a47a385ecf05cbf2152cb5c686616f81585bafa01d067a5a086cee61113870dfa9bda1b2eb1975403b994e4669b30bd5354784b1c5126ea7313e3230fbab806e8cc7411149ac52029430ce0be92453dd7cb39026ef26451d2f230392670bdc181a0d0b24267d08861c5e5e0d00d85b84a0873c02f678f2522eb8bdb04c2624256e79396404f475be988e4ccdca00ff9c4aa86cc48ac5f05d2ff1ae536c5f576d719862d44049edeb7d25c2e78e328bff60bc1f09db639c10486d65a8da9638080ab92b3c9af7799a8149cc771857f3d36a495fd7e58236beccd8ecb68aa4fdd1f8b3fc21796e7327e0eb730e0cf78567e40a8c0842dc3a9f7451f347af2375ef47b560bf6f9cdc8e682ae9574b9d7c9cb4c764ee84a22303a35b49568d8dc89f74c0447b0f263ec71e4acc6de6e6116085b7edbb61ca4b198e2af4dba714c3fe6b9c821ca1880eb1b896b01d086e80a43ddc9619789c75ca44f8dc9d4013ed4d10c50976201e6f020d6993d42fc902b299000581b04d1db1a4c548a774fff638bccb298f45bd0a30ac11a107e6b9042c41634732855c7431610456d2d163129166cf90feb8df5a72ad9ca31a8613ca3df539f599996904716878028bd884b1a8d75fd0d3fcc6dd8e007f6f9761ba55a00fa6799b6a3ea67a6a55ff8843cfda811582ef1b553b27c05331aae09b5a46aab96566568153afaebb7b4ae5e71f7cfa6fe08aaa52aea18d1551068e25942f623c4b8e8a56f46e352cafe4885dcb1eb19c458580d2049ffd77af8380ff452acf5ab88fd52d7ef112c29ff6464e62465398fafd06ef81bd3fc2b4feecc6f45f0146c96d4a7c0f90e861a1d433c5deac14a019f50511d6ae9f363952c0ba815bbb3774c97c16038e82e39b76bd15f58f6c693a973d1cfcfdfd65ff61efd3d6ded93c3aef8a715097e97d24ddc94ba972fdd68c732e1a9001f3fcc1a71f1f9fcc1b98637899fdb949c281d858130712d5d5408f0208d62f5cd7f81dda2649edca15790c87cd4e24ba48a7ae328822f5a21e57f6fc5a6fcc71d532ca6817f6eea89f76b60e4fc7bd243c2d2163b46ec46ae4be40764f95d1a51efe6f6d8274b668c50cf1de75ca2b4791dbca7c9232d147d568cfeba0b44caf8154bd09fe8a55a8bf1bb1afa95226a827167b13f33b924ca637182b0bac8b56e03327986568016841bd25cfc769000a7c746b2d930d291ea94f371563b92535003c4bec0bea1b134915286a1665b643bd011015ef04ac9d5abd487c0c4d3c6b20a00646b476e518fc0b008960148a123365cb40be362b3b1694a8d5c05d23b018370f616496a52c2cd25021c3795baf897f812f62a5a5721ac8170e79b49cdf906bf71c83af3c445a82a9b0979506e7df0fff03405f717f51c69c995d11456b03cd8bf9395d33fbb127e4cf9d8fc8411a26d42617ff2d64e886ba9fe5c7d5b85b43fc4faf88e7b4eba7145234769d58d53a5c07d1468693b0f93bac6e2cf5a931b11506f556484824d227e448c0a3805f2217f136c1a7d56f3421588e286adec32d32422b95ce8fd81eda1c3e9beed20f03cbe487fdf2d65f59add2bce47cb5f225b2c6c09100225b4276d3cb5b6792be4b8f0489bb750f1188f371880930d79cca6b09b2e3f303f766081097bfbc5e538d3cd4ebf27befc9132225dd7428d444c764860a262e95221f0f1fe57f5ef3e4432d2be9b3c9954a88e58cb329ce9cd37f4fc8494ad1cef800a7bba8d2ce486f7ebd7a5bc9dc73458bda9e4c46c6297469cb8d4e3877ea8db014c04ebd313c6b1ab74abb69b03334d562422a6529b8e68f4262dd3ff05acf1c6d0074d35e4e977c665a26f86d6bae2c4d64114ecfb334c4d575adab7905729ecc6345e3726d7f2c361ab9d75de26315cfeeafcba9bff88c0ce812554b1c6ab0c5765c5618f1bd8dcde547b86af905406ea216e4eb454e59a835fd9648dc5c8c9da88d7a753a2516b50d93e7226868bd0c4c6c2eafa7a0696a8ac2f0f3e6958efc1e6504032b42962ba6eb3c5bf856cbc6bb090d481489c42a8e6d5721b6cc02b34d6650157752126de0cac4c31b7b073e2d6d546476682be55d764f5bb3154d70dfa9244a6fe5580db958e4a766f95a61987102d67707838b177d10d116ad56368c48e815b30fef5fd6554acfc0d9e64d3c4f6b8e9b8ef6af2e09c6126a92f0865045cf97c94070d2fa013be48df5e50bbadd9062fb6183b147f7dede8b571826f81d546abddf5de4f95a97bb75200ef5dec4abef4950b587763db4fcd61017a457c00230cb8aec3bd775980ba70362b6e8d064f81062eabc6149c115feca46efab3b703e76a9241c72f6b6810adda98e1baf07d6a7d8189f6ec869b54941c40080a91980fb827c61c1f7399539387fbec2d1d46a54b1f518859b3a385ca098b86039bba25d2e49b7968281e3e1c3e5c48f2012680d81ccedf131a8c8891b4134bdcfc70854fc7787d03671c9e55185793ff6926ae12f1dfe8cf246fcd33d88d159842e8dfc7c257836c98752b7152039eecefadd80ff76e816146635ed2d36fbcce101eee7daf1515676b9a2b203e1cfc8859d128852e25f9cf924c16d4a47272e495645a6dfde91cfeb39f4e6a1613a901e2bab7c975c885f6424b617475aceb396d0d3da14c102a69987f66f38599c60210dcebeddd8bbc80aefadb225df56b7f48d1ab0a8c92584a41b9fa726a7de8620cd32472c1b89ee1cd0e3da8b595f98672343417f766bd8d9c52f3cc1a9bd6e1c8c1e588c023ac6e5355e68aec6bcc303577faa7bff293265f9506c6107432145deedef7b254d5890c755a39f5b3aee4364373a931e98d5ec011d247fa9ef17a68b2df72810929a628f6ae634f4427c1538dd02e1c9962f33273cb6add06c81d6258de794f09700a9c8b2b6c3a30eeb00ece206d70dca75beff10e9619d80bf0a7d93f24cc82b33640aa992945eac34fff30584801e2ca0fde10854ec1c60cc5c4bf08753009063e7efe7e07a94cce2de1d2add68f2abf5e6fedeb161beb5cbac9ad02c043d3d157acf018751e1140776a7f32d71f34c05cbcdc9c08a7c7a03f596dd7164540566fc54fc1fdc2b23b14f002eff9066b55e30040ff5ac54b8fb6d9d643f939aca40e5005f1d5972feafcaa34f2a72d6ee03ed74fa5e70faa11ad4e8ad2d0f788900aba49c29090a73b3432d9ab5d933c115abe4718cc9e2a2d770e9cdc735ad5991455ee0496b0ef2465e39267af0e36c30da7f3ace53cf3f6010679001e39f6e2a55da65870e9793b447b418ea1e519dca3c2bf0e1d0b0b07ad96a0708f428173694f70a113c0a0f79b3251914d7f8af58d59d6e198bdd6155cc3a4468be06e0af9a1c94c488c9fc6b44e759e43695c0873c1415fbf56c065a3ed585a790bf38784ff3cd7baf3f4b22533d735684bbde582438d213bae7dffaf897289cd0052d6788718be4e3b7c071d3c6c7b75f6e0ff3437e48217e179e35db0f088e80c8aea5749c71fec4985d00647877c9db4a55b51f07198c232adae969c821be6ee6c2b1ebdadb00a8916b1f93b1724775ba9efb421df723d54cf22caeeaa1b6cc7567a4279647a6e099cfe285cb30cea5a1019f43cca22765a15759f20dd681057a0832833c15c54cb1e3f0196aff51abc2b0ccdf37edab8b536c2a4bb072293224e9d4e83ed427b8ab2b92f52a3fa6bc28269618922a022f67f778779bbd3d164aed6747c9639f1628a6643f47dee03112facf7431bfa1954ab2d58c7b02ee380b86bec76fb52093fa5419c17f20b123ef0b0b5c0efded93f18e2c0aef25c1665c3f91a3f7faf4dae9cbd84efd9ec0a5ac4521051118c1e28dc3282be83918c9b23e06363782ad6d6e99f69a016153f70845309cb9d8e85d0ef65aabb02b0648665ae39d5ca7ae9c4de2cb940ad8e9b5e0e59ebf2298c6e16fe35886fbbeecc719f000d9c9764f3f90f66c8f9a243bb25bf84ff7cafb76be8418da346319798866bda42213d5acf00d836b2a0487b7fef2fed4cddf10633bc7f2fc2c0e7e7c8785b9bc1eee0d2d5ba42fafd5360f9c84c1a9fcf8a76ad2916c31d66257c39a760621cd0ae7b4189e051036acd5aaded0acf934fef24fe71a14cadf03afd4b7c1752e0c2890930d3f74b2674bd6135555911face869062ba346fb8bfc45d09f224e69273d4d00d5451ba213c798811eac1b8fdbe4631313aa8e35ab728a1bb9db3c806c46db222980828ecc596b8a081368d73f184401ade2b7f6debae497ef70b13d2aba139f22f233b4299ebec79ec32f868786c60171f0633ba142938699a702eb57a26d9d6b2e955a90f1020e798b3903e9d9dd8f8c98888081174469697170c38d5737a58c8258c8a9361d270357e51b67011ebd39578f6963f18bd050d014b592dc375e006cd02405623bb724b1dade6b3cc632db58ea103ca4a3d939dee5df3307dcbbb3e3d0079fe70c6acfa53430f31075b1ce444454ab8208bc4dd2b71d3d8dec8bc4d49797d2bb3f6b35338e9f1100b6c079f327a639e33cc262fad9b18fb3746829af4c08ad4a84baf08f6cd31070997c6d4b78fce290807a05914db726d20735e0e7058f73856aba4dc8642c0fd52314e856f32e5d0dc7edb7fcf7c5d04e2fea3af94ebff28fa8e886d756049f0e8a4c2d22c94866366ab8b0350e1bab7094ed1337ce3002463e49fc894ccbfd05f133ab0500da55ee616f23b36a748c528ee8e2b792eaf869e606de86d3eb0a7822b7bcef21c010695c05adf371a88b0b36981910ce1317560bf020004077dba0bb55f26249beaa36e7da60d783cf89345b38e3c1b5928b9dcb5a677ec98cd4acdcf960d3ffd40e86c6fa43ffc198c2bb1ba99fc5fed92714591730fbc7a64ab5ef06e18b5f18bd37fa9c3d954239d6dcbba27c3081eb7944d53428bdfa189a83db26d864dfb4bd729a2ea41ec866b8814d8a0664f0dbfaad60dd54ec7c61358ebc416a6bf798fc65c408e48c785e9a0746548fa593858cdd067ae1e0b5a35e49a338dffb1aaba512f5fda377b8f3f4aa6c76f2d33a6d4fa73169a9a2cddbe44b49075efccb37acd99774e63769ae150647f354f0b4b93ff3028c66de35f1d715146cf5d5c1a854b45bb38a5fa45aa211f988b4c9daf94f61ceafbd989d168439c63b388672d2b0bf170b037e5c38e89df56f80d7c6645d7c045f4118fc79b7c667e0072500d627eac7bd3a17614934e238c2f575f4a978fd53246da9d3df02a28b9291cc09a71361b010d1605e86f4f58298cec9be2f7e17aedcecd5d87d7302b2290f1313eff056b100ff9890dd989f495182e2532c691d96aa97dbb2ce6481a0f76b4e26fcd97a02996c39347f90aadad5c4a65e62f9ba6f37fea8df342d5c6cdda448bbe7dfc4a461fa8cbe1c2dc0a78abcaa67129b998e6f9a913a6e7c84e36b936f4db32f000d06bcfe8ae2d5fac04cf45bf3fd3f117bb0b3da685e109a82f200a1e0d7f8522332e5524a3fbc6e864a86f9fbe30558b3263847d890afc1b64e835e1526ebf69d743a13717163fad0f9e058816a176051dac15dd0b7e2f0ece4d367abdb72a339898575595bad4acc3b46b597db68a5b6141f850d243fbe0b3cc113bf7eb27fe4359ddfc4ff3ef16bc7acaa0f3524f310679c03333d3fcaaf2e7507ba98f8dd1b770f36e426250b1ff8a9d4bc25c463ba8a7630a582aea3252e0ec28d656063d6177f74b1c88d457bf9059895e570cecdd6fa724d2015eca9c76ddae2798f82a181582723d0bd2fe875792e22bbd67b111812ef40703d6186261d6be2747c72746960fab45840f4ff6907949f20902b065fdee98d2c13ba04152bbc70eb415b14e172b028771339fb0ca708bf580bd2fb6a6d6efc0990ba5d213fa95f2efdd8b1c1b699841b8e154451c5de23871b54be129af8e3043ec5780cc395f325d33c4d932a30171ad6c362281b895db4b604d1d097b8f4162bca2f6da265e7a2d1130043a9d21c95effcca1ef06d47c6bbb7860392e5b77d17706b5accad18e8bd19ee8ab2e950a5d8f6789119a4dcb02ce64ad5fd29879e948be85c8c35669a06b2fef4fc27ad44a3a5cffff063f9268ba3b8c54a777bb750eac7e3f3ee767a4eeacb1b7019d3eac82fe5f943bd042063df081da663ad14e7f4661e550e495f413002a6d3eab63e159baaeb60fb7766baabab0d22b82221bc37ed6ca672ad60102c15d040e6085a1f4fe67bcf63da0a15205892a04dad9b3ea918adf24d6479fd16e935badebd0aeae1cb6d505ffc29abfff2708db39d1ff6420288b3b779d291e3ac4b944512eca4f63f4e1069281a089d91d3363d15975ffdd1b103e4e2c163bbeb915a5d08454857a9d29d24b72a7e7df6e3a7e90ed517abc95a448aa0179959285247f17cc8d0532fb13738a6a21738ebec71e2e68c55d8a8b77d456b385408650e627970ef13765744f4a72e4990912186a403f71bf2a9b8ac7211a0499266466c65de65157d36302cde084d348ba46da3efc430677bb5b34f75f39f16bc710dbe9c4a4869cc6e820ffc59239b1049720bc24f5e59395f0f0f153bdbf207df37311e0d85db2906f70645c876c000583812026239a535cc06a4a6c2201b19560bf574825662aaea2dfcfb3551752e89459e4082e9196dfbe1251fdb94b9f997689be8e8609d4d78fade40844bbad5caff8a07376bd83a13141c14d0ce0eb0a9b2e621cd7e031660970aa4be5f7dcb5d15c2bd2ede463c6fb2bb6bc1abcfcd7a1af96f1ae98ae81d315af3713d000ab889760c12443ac5fa79a48fafb39bef31b3c3b9c636927e868259e64ee02f2f9a5ba0b9f1c4b2a9e7cb48beb319433419798210d720f6879e4cefe84130bcaf22c1e270f3e7262a578ced12348bfacc7ee33573d2916ea63ae14659f467dd8e5f72115537fecc1406e977438fa47375d11d5327cf409aa1ec22b0d4905084e18135917ce073aa8bdbf4d9057bb2e7ae21cd46342745b6c1a43631a5a25baf33e59e461339e402f29d787463c8d5ac2a889e7d740b7baaa588024c683aef08e721ae1f880966e35e8288b4724d97f6feaa0d812a9e876d10c7c8c222742ed14764b183b66100f3644c98ee165abe1f36a2395279ac1cba57258cc5a26aa5520a16d77f075214e439b6eecf9791cf735066b66cf71442b377775018c9ab44312fb5a40c4833d198a2cfede24b5f8bf7e4231c62c5f33669a2ae631b3a116af83acc02b72e05819f01a5e1f0492b5b11ee1f3a73d8bd473bef885cf88b2e8e35189bbc8ae8c261521a0000cd0bebee7295e8d35df1cd49f078e68993fd10373a53eba652a3f4be4016b27961e93935a059a321c20970e694c4678813216632a684de2ba44885592672cf46e54c9ff27d01b29676ec1c058628ac1e7cb063885c6f6e428195a37698c7f1941c3066480ef3d4c8e1b601b6b65c61b21c10bb3d84d09f7e1eeb38b7c94d1fc658c57106b39cfcad009e4e4b93c6d969b0b7ee231234cc1383e71623de0c1930db8a8dbf266df0e2d924da51d9f49e836b82d2ce0bb30f50bffad57cb960f448965a23a6057140f7da0b5e29caa6f95025027be799a52fcc906cfd6f55cc96e712e11ba2bdfefd3ef150f1f04f6d8de5d7f5f9f9262ffd4c0509078cfeffc27d9bacdcbd99cfea305c080c296d6699654e909a3f8b05ec63ed6bf1c01f9b1b1ebcd5c3d34f8d5e8a5d3386626297e31f510a7dbf67751afc4f77effede7186e0ac5a05c4cc7bbaa0ca610433f49bc9518f1ab48049c1dc8e7ab9ac646e024225326431294d5335d627c3a6e9e8a06d8fbda1720dfd868c071682118c570782845edb082de727983c8e4be4aa9196046dd5a92f7e3e9a3d993613c76af2ed052681ad82d8446aecfbd169b3a659d27f0b012c45b9fd2d5b022492fb34176720daa6af6b61d245cdd44a017fcb0d82b4bc34d8c14d8c815b75616a4b8a0825658e903767625b4514c8ecb6bca7e3cf28d065a4b18456ee149ee611f6a6ed9fc8060a06b0f0a6e3de41e7d4628e915808b939e901cd0e48c11deb612f94b1eb4d589df95e2b19077aaff56d57afa46add91f6274ca2117fdf4ec9ad15f2ce0eddcadaddeb39117da645bc127188f7596ca6c7ec46914c17968e3c2c976a4d71f7f8e853a558d6f09cd504e0475641389dc5811d424893cbc25778b3f9ffe28d83db243f69d7fde1fc646d6726b7ed9ba058a2a69b0a368da3d7da417d71552e231c3334b7b37884f84d831e2952e80b10b205eb9b5c02697e110e3cbaecf4e5af641335a6f8c4d00e8d2862717d2164e4ef64ca969d66b23cdf3bf06f801fef9553859094bbc872153589e8153a49c233294fdffd46656c1304642139fecd39fbb08abd4b8730169b9615d4809910dbf0a2ccb1fa8d0c38c950265c77fc4904f97c11c5e59b9f92bc653e67bbb8ec57e1cb7111dbba62ee56eaf48210af4f5f238490a4aec16c6c60fb4d968915a5a6fb7e6767111a6dca6e279498aa016965c58939dc65f55863d7c21b6885c6c360b46772571acdd7b3eebfbeea2a681e8e10e4ea4d95e259a48bb53059650c9914c768f1b9cdc3998558b5c3fb2bb4a643c85cf4ac4582d554fa71a40235700747589a8f837ee85a9c66d18bb3d010bd28f47505c45bf7d61822152e6acd38b3103115e3f4f4839d9ed1fdc3a9abbdb8885274ebeef30278964b4833509fe21a75875b7a1e59aa1f293c9ebb12e2f8f2f112f99fa17c5eb3e7f4991416e2829f7fe1f851fc3fabfbb6c03ca56f72f11e5a21da6d3a6d9696e7de32137173b91c2f6891fe71089510ce634749312f9ac7124ad7b6757e4ff3d7594057e65742c447d56a91e718ce52eba5bd2d70c9fc35c463a9dc1c8591d8dd2092a7f6686bd784de00568fc57ace7ad9ae6805c37e8b751349b9b3ef1bc5cb2cd17d7a11f3ff522151311ed21e0b9c9c5ad9f1e4787e9cca1732f1666fc70b51e9764e66d1b9d30a1d88d75524d3fb53e5fb3a618b50200ed743ee6b165b147726120793dad8ab8b10e937e32de51ec7e3f2a3dbe047895ea4a6ae75739ec0e004cd0ee5fddea612d85a1ab88d7d2736c6e5272a40a3e47d013763d5a9b196a4c494ebb2ad4c6f72dee216b533bff8a61fb1a5dc95f39b4206ea2530a7844e77df2500fdbe7ef344d09898b7f3c5d8c79e3f9e9e99981c3df0e3dd7505696fde18c154f7e02d9bcfd47521d7381c93ba2cf41d78f561a3f53eccd577758e03fdf162e38e6b7ad8394b396bfd6aafce275591df4e8032d64784b7a731c408694c16a338d771eae93499d4051f8c668712f2c64fdd596bbb9a10a35766928428914a38b8a557856e13f97eda358b4489ff9ca5d523841f17f746948d5aee5698785e51492d8b8f6b6ec652b0c876ceffa2ed67efa633f66e21a5f435caa7a7dcea449d8e8a9bfbbbf8357cf2380a303ef8660522910a645ea39fe978baa4a3fcc588d283046b5267851f872aba05703ad893f89188b0714dbc4866be93dfb1d0d04e374ed83abfa660da4c6c609a3274e432b71475270e532f06da1210163895ef1d4a256adc7f300262158de51086124508d017712fc2eb1e2fd2d92222ad09b2f53009ab06d9bf5f3e71e7383297e63ca640e44389dbb99cf0f4845f71bcbd058bee28d4db1d80a328aba88bdd9a80b726bc51e53a92960a985e7b86ea2a8e88e6e3641180eee8cba7303d54eb60aa3860a0505a143ded66dc49565e0a80c0b31fb85f4966a2154c9d64eabf2dc8ef2a2014cee92a3ba64c27b3bffa528c9bf353195dca0e95329d8dc1d50b8d5f6cba99dfacd70180ba326bafc24a472a65a5929d7928b11443974187af4baf36da0e89ce5f08c5bd698fbfe81810bfd7762c0f5d975fe9c778e4f1166a5e3d8fe0de5a195e128bee49302ad6e1788ad555b9ad8ca4892d11df7867bb6edadc878894a0e199fb4bc05a34e04be99f27af0916cd68dd2fed1b2e9582cc30b8048e2f848d49d2955fd5ba97f0daef913749324112ce2864ba84998510a5281c1df35afedd4f98e3eb6c7b0c0a98b3477bc07e074614cc4d85fae7a151dab1a2ed42c43a38659b2fe859ddba5da7d4f2a8f63442bca4dd3e11b4b981071d764b8e02feed5b956eda0b872885ac801b678a54ee120e31429866ac759f6f373a0f1b95a3f1b42c1087371758e01278a69eff2eb0a2f1221629d020c7754b0ab0de3a0d6a0d2cb1e90f23fe08faff863bac1c837bf6696b734d066596022331c3d1cb3c3bb9be964e396a1e856553b6d968b73066aed50439d8e9a64a332d02a891c1d6e29a81e0bba8ef5a9f86683d83d72391b67b62d1780c77b6457a265da0b3599e0b7918e49208cb5cda359676c8d96191547ffa8cc717cc7b6a6f449349e1cc4beccfe7613f0d3b715e4882a69ef9173ac2c261cb62291602d61bf53ad9652186dbde45ffb908d1316e4ed3c1d0b21e95ea66745ca0f5d480f690d2c519b595ce82e967644cf7b72c9cdf158da5a7e8443a6c7b60c129f2063cfa9b9f8989065880eec8dacf623e93db8e99c09cd5d94df9ef277ea6471ac2911a3c86a92831fbcd52e3b3af31ff8445f043bc48bedb11069ca2b250ea31fdd4228cf2f7735b6012dd9027594afd09f0b5a38c1675fa7f6035d3b5669fc3375cdf438e635b62e7b4ddd003c8e366671bc8e9ef38d448a48e52feb48510daab05d38fa18c7d8c0b3a5e8420f933737a145de6130c74925bdcb3e305a07202f91385af1dc4808d026d33e6dc360391b8358dde02b04e6935c783280eb340fdfd4d015d2e525dd18cda917730df9d19b7eb51ec0f53b3aecdf46ee9f68fbfe0c71896553fc8e85115080ce5ae3937d69820757d54b4ea04476815a5321ecfa8667b5ad5059a4b5c9e4e0968a38900c7faf1d52b895c8420f1ec7fb4839fef81dc2825e602ce89f3c06902b61fc0aeba09483dadc596819019c54d2d1c52ef98bd2f7e6c3053daa2cc69529515d9cec00aa1a6aad3c4f093857fa82cfd78bb540772400277753a1196bd4005a91a3650f65460b3a9a36d6c53551053b95e24d1ec4d078cdce647198ca0463cd7cc0501369399fca08aa9df985e11bcafeb40899d419a851af6398eb3c15ce33a3d90055706c1da634e3120aa28de3eebb9bcb14e7dc2e11834b12347dc58b2292aa14513bb993b78f8121cfbd1778e1ee331461a556887a63c6a67d3265080f3bbf156f186a26bb800c35ac68c0a472eab420aa380146dc9076bc00c65e75e4dba58475e8b2c77b74f292db225fde4f6d2a959f162855519f07b77677a56c7e0e91c7154c9d20e400eca9e868e8cdc17027ee04164bd29678d7b8e6319730f060ca1b246489803918f62f9b7d759add3f3f4dad0a6ef1de4f4077945db34a570cdec7f7958103e0f73ff1ee8c466ea692d1dfaedf7e7a7e94484e1ca6204d044f468f4527844f765cf4eab0a33a680d770ad3507002e35ac84f6687ca59e4fcc3bb51955b2d4d98068d5d44a46ed5ef40704d3fb7d10154f4aebeb5d6a305de2cb6b2711c5770bf878f39f35779620b1d695c2904da2f6a595852630497caae4cc9a822c4751b51cb69d635e6ec47d6972a29c59515e2eaee01a5589c03bc24916b76c32ed9b78950e910211e331b033c052413e24ae325af29db647dd02ca06cc5224a8ddd55f26ac43a83d96e0beae9d7b9ffa31d515340cce114c66a177f8d7c291bdd49c1490e880d8f82ce4ea6f7651404d81367362f2a3e9b0ce311eaa8fb8525cf8690a8f943ce49bef0aa03caa44fcb439b8b7a31a72fbb61208a04697ca3bbf8b5a0606341a0e784d6cb82b093b274ebb4cede80485b612e321be1166e3c84f2bb1789b343863ebaf12ca70a92ac55a78c7998764400fcc9812fc3e8737af721a4d5cc5264f3a291f25e2b52abe5e07a38ed0932614e87fc1bee6b2a8b66b83fbaacf3f1b49270f8c78c5468ed6a7e4d2571d60cb9808c8df22161e553f1fc3361b0d4227e26d087c80693ae4c4477afa54cc53c3b15e1b3f4e137f9366aa52ae0ba3e5f2d50c84d243d55326218faf8ffc2d6e5202bd20e4823f1b4574181a7470dfd658471b2655b40395dc6359ae87a53f19edb007b977cff3c4b0dd1b2b23d4f4b5103cba48612cc2a8d1dcd208f85c903caeba0e6d3a7348a6129c86843df4bd2b5a50699955e9c1d6c6200dc5bb2d90df887813da1b9acc7678755e24da71ba4f60720b57ac93e7f8ca9e4c9c0be6a608008e5f5ebcb631542c9c2f6c408279633b43dd688ccb4679ea0e0d60267f194210ac7d7ff258f76525bb51e2ef7d72bb10161a72083e7de7ec3ce96f53ba4f83eed496525ee2ec23ba0e06713cb094637f2863d945432ccd307ef45e62b25266282b5227cbe0c9b27e2eb55c7c15510ecd3145c01ba5dfa6b57ba234d1548cd65e851953e0fe25805acbe0be413d12526dbf031d07f8e1177d3377a2575fee0dbf74eb62d01187af05ab977b1014a5f52a5a6f20de227f3a537eff328edc4a170dde3649d6778aae839e1e24793b44b4251518f4f39a2d87add841b3eadfca7f57d968e27587bcdf516b425e59866f31c19c2ff71c575fe262536499d92873266e559d4bd873147a449dfc72d80770e045c2d02bc3cf98270d5b66031cc3a8020e688c629886cd664a2e9e01491262a51d5472440257dff2e991101178abdfa061850683747fba1575df27f75a96a4d8aa64da924bb79ebe2e1e23ecefb00e88157f648c9ae937a5cba7d26dba81f9fcef54a4d550b6977656fd6be5226f77799b1b731f7f6f9ead317bb6a370075e4b5314829a0bcb4f67f35435df3a8303081a1d427409b01ba7b9824af827759643cc07c9ab6c20fdf9b94a54a3183d21b6f475f7b7cd8a515c1cef21b386368a39d855a92eabbf9e691ff24556ecaa9e551a8c415d89a0305c15cd8fa9838fca767318f14de9197e878c573bcc853a83107909311d62804fe87c3bfb056cfd43df4c09ea3a0d21f933bf722bfc924d1430ba51efba89d0c5e9450eb71f9e016ef8833d0a06e59829e66398b1114d39479f03d506394ca034388889b5333f1d0bc9fd8f09b7ec5cb4589aab56d96b2a2d16aaeb74d81a011ad5e54bb686c1a8df3a1447c7dc256cb670644010f68c1433c187b32920b9311ed70434f597258ee69a55ee5434c4c80623288f8cc9889498a5fc6653f4b823d6c3e6efe83d1bf4950ec13f9ffed06013b0721962ea59b8ca86cc06f05cdbdd0d2305d93abac05726b527177683bc28b149ffe1fafa89c009dcc0caf55e1d9bfcd1c4fe397d3c5fc0c6da383f4c41daa66263a471ffa9d981e47f85ed33653fdadce24b56b94fb30e567fc6184e01a8905a7aeb5925859118a1060295d50487ba0c1e76ca8f99e22f99a39b809b6505842261b0d4deaf7d83d2fb26bd39d2038bd1353a36ac970cadfdb87056420c78d63ea2b2a7b8289306c163ad35031750bb6adfaedbe1a7d51f5158cc4b04321c13926f56809b0335b6d88b5f779906cd0fcd5b7c0f0bf6d57490865b51ac8c9710997aa076ad1c40cc145e65c02d25485362c3f949763200c123e7cf1bd09cf556070bc874f0ab53e6988f439980de48974db3aa17f6137067fc13aaa24297473b2302d7b44265f473fe4455ee2f9d773feb52ca364a20df1ed7c6c78be155870a586e2132871ea4fad2b4add1d2c7040b46554c5b8586744dfde9612a76439e16bcaab8daf5cc20d89f880251a9fe6208c314095da7ac5ce369c57a576361cb1f66fe1da7513f997fd3c6e77b6d166592a749034ea50feefdc2f7a1bd4e6ec60fecdad23fcfcb829fcc8eaff523797d9dccc24145816b74161f3f6c47ab2b8632b0dbfaf01938edb025a9c9dbbe795dc542c24bd7135c7c5bf361c1c3bbf4a50497c9ef18ebab83833e4452a3df9657850d114a9d102ab023ae9cdb3db837d1b321a9bd69d9a278b97d1e086a2401c1ff69f5b228bf2b6cc7fd1e4aa6433c0bbd64a74a42591dc0ddf278cc12313d7d1b81c316018206e1f349b4ee5e3ad47562795c9478d29946e442c4494b6b6ae6415258f179cf340a9f99f9d16fab1a9f05726e37897d034d3f9b469daf9fe93e4c3994196a07c5f9128f04a17a8261a6e527629565c2890eb803722ec91e30c06ff14f407809e92f184c45440b20cac6f6be27fa691d140e8e584b623ba07dcd1ce6103c844f125671c253961ac00310fe5f4ab96bb88e7d7d7e1ecf63b5af80088110724d6a5ae7a4f6970cb920b3c055d82daf8e0b1ac53aa6679f5ac85959ab6264dcd6528d5a3f1a7c7fb9fc0e2ae9ed1e10a3331a450d6887fc51b0861b5f461369ae74099b381185fe076e2ea69b9eb54a699c9268fce1b3a07daf6b5dfcc4c02975307c9e725c3047e0fd1bca91f3133a5a14ba5cb001ed0523a95984b1a5c1a57bae0f3f556cf9c0ce59c2c4f892d0502ed46471a6745a5228adc2edf9f892b906b5c0e4e033feea3215e2b140993432d4c96c91e566cdea64a5a43648440d6cdce43c803ac6c3532d860473abb463d0737e6634aa9b20c78e73c3bbabb6cef59c8dd38fef882ca0c68866737731ac94fed1f8ffac930777301a35eed5c538ba913a1c63532c5fb6188b5c16ed280267439dca48f966c2a43b4ffc61261a17aee54da1afa7b5d2a92245beadff99989eb90a7c1acd3c6a066446987f64cbd6363bf750761e4d7c6c67f15118f782c7b9dff23b61bc124650ca02f0c8390dbe4ed73f994e1e5b45644838c0c6064624dc7761d3254dca99938bf376bb979921dfc19864a0fa2dbee6eb33800c50e4867e4ad14604e053b9a6339d5aabc5fdfcd160626a11e805572666d182eba3d983ae48df106572c7dec35eff7078d9ccd7e507c1e9a6ca2407231a0783bf13d201c4ddae4f9b77b4fb855f743aee3de013ba45d8a6420a476e52d38afb23c75f2f1bffc4f2ce861daa4ec733a757be06c5c63d086081020ded0e38a7ca7ffd27ba5cb21bc403666f301572e1763b2e60a7c0847244f540786740d26f0d1021a2b81ef853b2f07109f7094d4ae75f4e84cf1bd63ab94cb6a42c38b9825572036ab6961fc49dbb24094b2de3f3365613a04e557359ead16d4ab1e73be6dd71f37e88123c8b94c25c8b2bdeb89c517e413d9d09c6cba7aa3e573a1f5621948761455c665b713877db28d7c062ad721bca8b7b28ecc060b8ed68b461e9db67d4808e9e2446ff7a9f2e59161e6a0fc484afacee5843ceb45e6fcae60af3ddb9749f003d9889039039fcebab673512ecd739ff5b610a9a90029213e112cab2d83a709e19c7ab3ec16bb60b0a53f654f55ad2b734df700a100e5f2ccb0cca15802cffdfcc8076c8f22dbf9a8d42bc6e00b4548acc9bfff67c5d812ba4b35991d6c58fcdd60cd3f708e06ba59abe93bd44831cd6e403fe2d71b54ac7d813cfb4eb047bf799bc95f460fce9549b7a9a489f4ad105795689cfcdc9225ebe59299f6989b58a3e0065a9f646d82aa27fd954f015889562bdd4f897fe642be846cf3afbe2acd4e2e40e842ef4a44956b251a8bad504676ebbe99851701584f2f4f69aade1ffc639cfe3243729c938c15f26f8c8571b5ae94b02cd95b26715034390a1f1648cd35b1f0614baefcd2d7cf27530d6cf8e26f553ecdbebecbc1f6b0f2d3f152c5add956bae4422470d5522af30f13dbeed7580f2d3c9404cdbacd60bba697e85aee7e54ff7b4a6217cd29730c1ab867cf530de44478ab8c3e57c51866136b0497b89749c72c2fb8ae2b9cd77ad8c6d1af8878b66f64acf9df52b15d9bff07669794a751cf198cb5b52228d9e810321dde0381b9e294a60651e199db8bc0784ada92d86dbaf246584dc6c482ae93fe74cfed9d2e708f49de7513a07cb38724c7ae1cc3a2648c1c394fa85c56043060ca058bf7dd4dbe8c515a8057d7c56eed326905f25f00d091a9f6a2e5c528b670ed8d20a1338100dd2df256b7038ca7b92675138ae0283cb9840c9363a320d4ecca6e37bce9776ea21add8af8d470a33dea35c40e2fe88952bb3791de1677e7b9c32acb116e2282c2c78875c685ec1621da3bf69c3ffd3cccd9f0f0b08fe8f1d126f9db0440280a00dce41ed7a43ec3e6429f119ba69c536d6e384fc39715c54bd37d0de9232dc2cb4be2c437cd2b225d1e663e10e49c3de42bf6bde842fa49329adf64d81b1574c368a443aca940dfbe491a33b63db32b3190fe67dfb7fb86994eff1c294fbcc11ceb35ce80a600f80b8c79e60a88a9a38856535203daea2878362368f2e1441f5252878b016cd943828f2eb46da23adec24265b6af97693e065848af0157b3a6a6c65a04b0bcc8755eb1acfbec2792364ad0ad226d5c5a3e7f9ab49de80a49acf8aa5c7616bb4a67c26bcbf466eef8be47fc155ef610c790591cecdb2173295bec56ebf4fd91ef9fd499fdcb68f36e11e6c618b84692cd0ec332c32fa652d952e73c3e3dd35c55a9c05f9b049821cefafaf3a59d7680aa9ce02472e2fe5055125c9b9ba2a7b25d5f6906cf88628b994085604f93a3f72c71d81758c471ffe2e3aeb47a8c17fa5d75276d4fb1123b94098ab68066b45f387ffec1d1c79ce8d905705fa504c8d6811cdb28ff827c1848292ab86f43787157dd05764ec1482f6adcd99c3d54b85c1896083cc31b5c8026d377cf8a4ca5a18cd75f84ae7461a81045c0290558c20fa6956c4f58755dda891ac458a6c915a2076467e537eebe355505fcc2c973695d7dea386a52d2155de2dcf4747ee1374bfae34f1e26bc7f26036a53735013c670e5a97765f637723a0404931b578979b94f25de1d78b8bd6dbc8190112f05654fcc37a2e3af0cb2218c27af91d96b4dac8c15c7891b08e339780fd9cbb3fc54ee9521ec8039151ae5b447e7d818535cdf3f51fa49a9099af7774862866a17bd8cc15acd395773cde28240aef35970651d141b1b4dd950f79db94e41dc623161575815f52f34b2c009c622a8dc0f5e3841a36edfa29f450341137d0a61620dc62db96d6a54702d96b3c71782051a54cf1dd63fb6ffac8adc98f0f85c2d472018d4129e2458df225c357e4c77af6284500ccc6512dbf2368e1057a2a1bb6e95cf5e2421fe6f0b616ece11b16ee36e39ac2d9919423c7d59e77810173c6d6395a93592b4626886ff32925dfc8d6d252ca7b642a8f96bec5b034591c8a8dd5e5bef050e3250fca3698de501b4147c104889e5653931be758151adae8edd7c7a859048951f53eb462b6eb17b571b9324b9e45172bb5b1c93c6923255fba2305ca28cde0c57ec6da95269c836cd41e3cc9f24116267ca0ccff81d644843f10689364df823e60110d295da8a109b616f77464182f1e933abee28bfbe3e893bd059ee8983a0c28621dc1d734c04ab7e3c39650ed778a7afb22e811aae45b0cbd8f2be085e01ae9ae29d98ea42b353f053e1b3e62f0260fb4aaf91c94bedacb06c9814b67792cfc18fbf0c74004714de8146a771fee831a8819432a549765e3d98e0381c4a7595d38a2415dee9b38714ba48f3c1346c2e5a92f5a8a80ec390e78e5faf01ef784e7f9a89746988302cafe62ebc6bea14110f831a65c195a164741beda5d652b95a05b22573d231f7376b3b80335d3fa56e8e72c2dbc695f5252b01966864fc7228549da767b82d7752558f7ccdee1fd86cf25b09c0bf84e6286df14c5cfaedc4529f20863117eeab700bd3cbfdfffa778aed414080fc42a8bdef1901c6d770399857789d317faa24cad19459b7870e7acaa3d6eeab55af56976c683bf101caa052643c878fc505476e8e9e47a9cbe4a9de664d58c79c5c9b66a524c631975db9d4bab2706e97e207a4acaad781d453d39f7a13297459ca8fd3c5486210568907e32505764e8ae1315c2c38b82b8a2196ddb0ba106aadfe33e9c80d6fc404353b4e44bc6695535f505b2e850f3db9741e6aab44cffa74ab724f1a064f4a6db4f5ad8eec214dfd50f7a48b42faed430a590e582fd8af38c59dc0732f03a39130abf80bd7cb216224990b0290f837c605dea7c9ed496a879ca50756c22a92036789068b7ee0b4680d98b0e5a2a3e3087a6eb25e717d18f393ec21ccb7f3e4216999d30ca8589fc7306f11d49e2a2b7c43302697d17b789c3bfb8b1cdbf4517033b234913ce80685bcda0ee097f8a669054bbd016d0f6c307acc0cd308d59cbdf7f87e4aada45e74bfef42954633481911d034ea97cac9323a4799fa82d4714ea6c8afe0da1efa2e9d869e1aee36a5d67b2d0511f77de5d325ff0b42e06c2bd8551cc0cf5cac7c958f9a625ce53dbf76217b52e473d57d1c906e24aa8c34d192ee6fb88cef39afd66b847e6ea395eaddc45d12a1586eb769fbd21b955ce3a499ec868130c8a6f22abda5a5c86c7acf53fec0d1373feecfea2a35039b1dd5f875e715a28224a278ce96ee79c13593e2cba3025232e08e9214042ea99f9380e35587e160a00b41b70f1b0eb4dd71b07336f46079c25be95471de8b42a9f4fb03a1ac104d4ec1ac2c3acd51058d10ca9d3b7b5657d7dec74845d0447fa39bda1fe7dfeaf26daa8fae39fbcdf733ef7ce643572c5d5feefb350df7bd18c9235a41ecae829193e2f47b26408a7b8e9e844158ecaf50b395722a6a476a1bc1212d9b3430c09e802f0d3ef353abbcf29e0fe0358237e2049d1f93e660f5ded31e438b8e7393b68cc6880d4901044081464687079bb02607a4977416ce5d1823d1d9ebcf7562219a2bf767cdc7eaf0a159fd12431106a23e403812c4d948908132242e1c97fabbd69a565b58e922d13a728e92b04c877e05e6e4d877a9d0a3d094305d89495cae047517463b8cc04fff0adee7f44858a6acba6c5b763447b03a42c1918dfb70f54123c18920b0597363af65b66eee6962d91221d23565ea50462518a8e60fc5ff7964e11cd80d04bbb2412e29933c293db3ec78a04f38802ace93251af084677107f9b580f4890a1c6bd45e3225364a042ca09a6a6a5aa53d46f1e3b407fad951694d4c3742c43e10125e8699f48a8d133b8074995abb90e6c1d757aa773558d4a4aea451dafe0aa9b4c926efb29afea8d85959927d431b3809b69c2e65b59e30443c66cc6f864c6eafbd7ef32c8eb7a1dc6a663f5e02acc2249a3a98c91ca21a25544af94e246616c099a4aa12923ffc2ee23a3694098595e2b8a06cd236b39c4977c6e3a1e0a98b4120a0c360bb9127e332cf3dde68d99cb086b9b0ee25dc287e2d3f5420330516cac8a4e04449cb6076c795274f1c54b0ff8d554f38526b09eca3771606195c5c51c7c995548e91171002ea86bd4bca9c893691fae0f689feaf12201d31d0f2a1a3a9ae7e3b70d787bdc0c3a2a76c9b5713ccac9026491bf43b5323140ab2a0547d84ab83a48369baf87565bd8733c6fb9cad027f435f9ef0cbe3c402e5182fc8879b7216394b33b855f48ca8b1f1ac798bcdaa6dab95be3da780be57dff876a641e71f5da35da0490d0639b9c178c95fcb0e1602ee3f645367b2c684b90cae2d4722a1d54afab89642e008970d172d229c1fa4963635b5735e3c2c4ae30cc47a0a906c85f7b38a9335a24e87c2f74aa5c94902d4ddd087a9d5f65cc3fd5cc543545854a47a4d0a53ca653be46c4c0a5bec89c253344b000bc86379a86f2fabde29f2b56e08d6eb3278689e3611b97b22bbfee3d3242b7451af288f34c3ad642ed7352f182baede02a5deafa1844f1084bc4b5bd9ebac1e5766f7038c65868c970dcce1525c4ba4557cfc8647ec40f9043c4b7027350472693fb7371c7c212a368f1191f1cf1872aa3de694ebe05ae0a4f5ede7131856c643d7bec87cb58c02bc22d4df105cdd1810d4b9c07fb41f4cb824c03ac290c3a9d5a76492491616355679ad42bc98b06723ec035049726cc3ffc72072ff46ec39a9e829374b6545d5a2b5ccf34fec3f1755ca0e6e5b228e0674d8df64e3b8de4ba669490198692837079a8828cb0c2090ded5cdc360f67f21057826e4834901f4d306114805513678e4823b290a28beb8204ef99ca8e0d6429c7aa3e2d6dc5ea23ff89d325352fe7c3aa6f47f67d26cca3c51c383b62d27b009235af15ba039e84cc5755e61052f18ff2b16d2e7fab90e94cf30c36b68c2368727cdd247ada97ce1b5ca19e47f42a04c49c1636a68d74e5cdfb53a237d65d3dd421b24ba59ee8f6d47bb3e7bdf2472eefd148a9cff0422d8fdce5a87c43ff8c5b33ec890e619a190f147800cab6d1835ba2bfe2d932e9e595a87246346c5468f1f7db9bf08cb1158e2dac85ccd8ffe8189e30bf0487cdbd5d1fc1ffe34130b8b1a2191c0858d64f1e216a45fdd3e5591f787914cddb4557c88e6f5781d486fbd0c2dd7b68a9f3a9e05d2d29e7aef4f851d421a26d826fb69d1063815db49414296c7a930467649f5b875cac06134f9bcbc2d6bb9c88084a6ba106a6542bd03a786995d03f8c515cf66004b64f5f7bde8986aa02bdd84af0c9f6f9954e86f046950eb139b09f270be9f4b5fdc355a972f0e136144f1fef3be3d48dcf2929464b8bc255c4e814f000db912e999e59d37c272bd5adfa4f68b237bc851c2510b358d194adbd97f6ee38458de219fd1faffa0ab3dc0591aac11f61a3a9342c085d23b6c844eb3ce8c0dcdac17553eb1316d89ede3c84622224d63120f1a23cab58f5462386ddb407afc118398e304124df2358778987f85588356bf2a89874b9b4f83e326e36c9dbbc7d761fcb81ab62a72f0aa03107a5410dfbdc35b8c25e048c25ddcd79ad53ff6cc1b00c294b420c15627fb66d76f93fba4e560163f51766fa15d207b63ade8db5d216b17160b167c098cbc26f19837e15a6bf3ba37f93d5ecce0c14e2c7c780debfa99eba75add973226988bfac7abc0d4f0418469ba08cc4305c60672c97bf71e832de7d48b7cea61ac81e67de5e4971440342624fda46bf6b8af196827b9f85b0ddad4746b67c4ba2d7d4cbf1e7db99ef0a787646414d6a779a05643a821e6c7d22cdedf473e70050f4953d66df272f74676904ec5129fd5469762d8864a3a15819ea7c5a1716b628862e2a4c318d7b96384b75c0de290c035d3444bcd196a3f5ad1464eaa0e0c8a3190cd3d00f9c5cee18c86fed91624784685acbcf82fc86a928449460dc5b791da0e973f110c6e7230bd5b3ec98caafb6d4ae0bbc515664ec0251e66d8f210049797d280563418218f07e430ce2096600e2cb2c797230b403f21ee8e88d2c3b03ca7b3f272b0daf2ce1c2eb069768d92199b31fec315da1caf22e5a422410282772cb91f9a52f7148628889077b3f81d145b8721db54046fcebdf6d9c358c1578f120696e661f51d1d99a44448873e45f02fd7682faf0b7735c9867aa8673b06a91448f34e3f73f997337b47e4aa66248682d88f24daf2bfc0deec8d8a6dedf6b707da048eb899dabb34c4fe53de0fde66e2785d21c790ab1d1584bdfd96906a3ec1c269148a6943da1c537baca09b8adc5b6ec812888e232c76c29c0db0c1c18bbc93a81920c6509aff95fb46704b342b8eafe9581c43d61a65d135da188d4d942bfd0effa1db8e068cb6618f8bff6c0fe227619aaaae571601e749fcedaa100be7386a3c8b68694eaedccb2b9d2e0a6356a0f8bf1b7a2fdb3cc696321fb76a0c35e3f3784164ea184229a60deb76fb919e6860813203a9cd502bb542a216ebe2a9b458daf52df6591c6c5f16ec34b4a35f5c0b5edc4868fe788465f70bc7340ce661d43c178fb6aee2569d4e1f4152d1acc5a32879a6c28191828a8410d28959acd2e51a37619f3ec1c72e425a37065f49a1cccafd1f2b517c2f058133b0a36ff95b6d16274a7776df502bc3909e67bce5d1bd8ecd3d86dec0344c14448ced0428b06e309ff6b61ed1e128fae6728c921f3be87180fbdef2faa17014be6a9085452d7ab3133f51e41ed39d14972bcda0449751868f847a71166f6336df799fca7118e8b474e077d2ee6b73be947c9d3e53d662c915cfcff1f09d67268b0f2767ee0dec62708beb43be805c0b4511b97979176df458fb1a925ffbb05e4b7c58a20946a2ae788f8c4c1559011bdbed1cdb72b7cd8b3bc07f4c281a43ec59b2e169ea9fb9fe106257e8db9207c739374535f7731ff817fd6a97da5aa710192f4d4a88abcfc03ba764bc7e5b372ba36252ebaa2cfcdb05aed4e0b27401e1befc84ecdaa343a4a8185f6f0290ffe91d75b1b2518dd4550a4473e48499c5a92fb457ad30aa3943fb505c14649e7e1c73824a409b28b62cd7363d112292325edefd2f03c936d84995bd6a9d1654f69ff2305fddcef8421c6fa5e95e0804d21326f29090661e8b7d29acad4ed70088e0a02d9e0c20ef28bcf6c6e37f0ea5e8d101018274b1a9581cb0e4ffc249c6ff21507ec348c2b295e0a78295c70db6da3f61e3e060097394d4dd297c791ef4b56be9b01a29139fd0b69e035c332179ab95b905fa9206a6469c25f5b040e6d41fc75c41af2551b1e653bb4cdea718bf56be7aa323ffa7caea162d9737f25854562a0e86ff89bb5933016132a74321b229255a7722120b1cabcc76bdf4bab94b18a321414558f4363d700eaea6b036f292ab2ccc250a1acec76075af3157ad8e301d6c8a38a4cf5c3de2693876f0454db9353919500d13528f47452c4986d3fe2629a3449e8d878f64d29b34b275e4fe742363f99640c3fd23b3d389f23ffdb261c466726dbbcb3c34afa274b28901d1ad577fd38c81fb19bd7550062bb85d31b513614780a02b6b5e3b5b7887a79b97532d503b43d1c7c48c96829feacef3c031665551659f32875674e20f38721cdc1e641ce9fe4e9dfb9e42bf08fc28ed0b03ef218d0b0e127b5046a9b965d8287fc07d20d688150ca006c79be06c7fdc9bb7910613ff3b5ba73d67e8dd2657407b021cdbb78ea5106f1646e9fab0fe2816f78a750ded955e761ba85c819d46a9e2a5ff21cdfc247b7350b0f8ecb1b82b1f991dba6d8b1e63cc69d4a7da94a552e695c6ca72da158fdd2260128890e396f7aa3b62023deff2db64c9a39b6030e9b39d99e280a4fec1683e09bb3787305d649f7ebb7bec1c75b1a6ea0259b734c14a0a2558a99db4acabfd497d51adfa4a46fac0c29d21fc027f0488fb7a2952e576fc9efa0c6f3bbb9725ee8556fb5ab129aa3e3ce912b2df7fc3c15463f649844144f62493b9ca098c5bca1e14e2148aea9ef0b851400b32db71827c0b0b5f8347f36f3e78f2f165f8e3fdea653ba81865efca377df1273b6a1f5df53aada0cc162aa096083a8ff62f6bd1096861fb1aae2851b4e55feb071284c12c6993dba58a4e938ec33d897b5333d67da388a69569a5762165ac069b0f9c00cca0bd1139c96e8265c865c2f8e7c39063bc077f795749cb6076df4588e2b2d07853a1443fcab992c7be89857a004fa930864687868405f9d06cd44a0122e2df619de0c07ddb7bd136ef66b5a49f7c6251915d5361fbf75d8acc6471b2aec8c0d8499c78ea80511fe930ed6f8ff4406b5c061678c0e23dc998804dcd4c7fc166356e536d84a59bc35fd2c111c7aac8ac8c29f5310f40bf0161bc7950978b886f0ce03e2e053e0d426238e9401c126d362e59556ff6bbdd7886000b65fde3390be7c2e91df00f2e15bdf77fc84040f705fe1756c4402679479a18fea45b24ac145764d68c03b2ace1ad2a40c67b027b5a81c8e29ac5d69ea33c39e236c7f906f6a8445b7a88ddcedc5d7a5b3326e9192aaa4b13e12469a21b34c6709660dbbe4844ff9aab8c1af58a076ce7dbe92a63aeaa409de0aed0d76b0da0578f55c4d6cc5b77637710c3498c8cc4718da0efefb279511b4a026d613e50a3fa51401fc786f81708e619a9369b6d9d5daea06836850917d835304fa3d6dbb4dd72ac7e624587ec2437f466db42e2d5c8bb03eb389c0482c087b6c2ea1e81f13a0b3772e452c3d640583c9705267c10d4d5f88f8322d2df8a55ba2b2fd5c7cb1b905a0c2822bd46d86e73018d96953491224866bf73b315490b2cacc59a13c14ce68372fc66c6f76a3ad62c9cbf734bf90b44a0c04f2f7545d501c91ced47854b3a5d3773420c653558b73d3c59d7d3c1689db1782f2ef33fe06b7418229a34768351cf11f61eef9f3839d3e5530af4d089305a32ebd80c97223b67047148a36d8c3eca73f31f2d94c04d70e89173ee68501de0c945b74530795598204e145adc81502d83c2944ecc9a6c42db1d7cd91682e05051e93f714505d75c1553d85e4217ae2af8f40110cc1dc88a3b34653871ecc50420cedba771ff2502b58f3bf353d62b68c365f4c7a6603f3c2a238d3e98594f1ba6e1b08eada2918519a628a45ecae4b17fb39ec117fa16c9448fe1d21645120ba850e71e2947b54cf87c599a6a2827263640041367784ec51b9c37cdbb3627f76f21955d9876ea0283ed22b5a07cec34792d6f9dbb505184eec9ef7f35b8237fdaf2b05fad8d98ce61c635c10fb5d803f9096ed9c7205b421482557f2f7c6807df1f893568181371df13935446ce065beb87a55c2dea524b53c6d4fa06a7806e31ddd78bb4704c5764b66c793128a76b159d914f5d76543df761e1db72935277f57a7a7b2ab9e7fbee199d6b4638094cb89b66fbd8c82e179f53234e5abb6ec764690885115cedd1677f5c8b2887ad48de4af560fa3fdcf7350cc5e6b6b90a23541c6174d906278d63a7b850380c412984e8b16aceb3971f832e85ffeec27da4a05c46811bb9dc4f3693f6036a1fe551da2d57544f4c85708b06f137692d30fb2146cdfad11a65ecc4e0e1afa9f25ff22858b14efbec3557074fbbf067122a39370193dfeb1b41e38b24701506d64986a4cad8853a2a39028e29f46e08b4ea0a88d180c6762ff166212ce8280c6ae78665f9c70803a313030a3e69c41f93f246738e7d5f9862f9f1d126a5fa1d67b18c6a6480c8ee7f5f5b5d24740b6d55fb64acd9435b7d0b6e13abc83a76e075387f6b93296293815504948933d97c33edd95a62f0c28db4d179e49bafceec7973b5657285a7eb9420b22caad226aa8b055495eba5974a94b17f3c18928539f7f4b03e140aefb83f2d5c2b96f74bd2689ef465777f03672d0d744f2aa232e851e5da6dbbea3ab5948b65a60872de801be0665553d27f8b831cd1769bb4cd61140cec1c9bc6677091656eff149a9546ccd453beb00c4a1851f7a67921978c5ee2ca83cc84ad7c5687c556f227f97a6271f072cab034052b22046be0bfaebad6df055d007fc5d7b6cc63aacf4ec075a0e93fc4adf32819397db79d38193450e8fe88e8effb71030ce29e62d64497c1198f8190d3b8b25c8eae993fe86e3ec3519a7a56d533462bf20b7066894af483442d6145cd3702592f6ce789526904b9a916e1c26462338ce9dabbc4ced46be7db7203dbbb84a3bd575a5ce2a624141e7d57ee41481a24d9fce04a6597a376d843ec7f024393bfa4f043a3f0a0ee18c5c8d990cff3c9b6bd7caca182fdf365d03983d95c5bf21bd7cd1929e57817dcb8d82e932e9d4e293f7c7adbded7646c56728c99afde5bdd68e219a10fa986766ac55ba1f05e6e73f0ca5df6826258eb31d002bfd3e0500171cdc9f0dd4fcb9955a058f83b15444ec721c431b9dbf103c252bb34ff11e2eaf153ff5a061dc20f386297e36a7f3ca746aa3a135e479e0ba55cceedb69a7f7624fa975e048d763b3fc94aa7d96da972ddee7f91b7f00d6c1cfde389f4ab05c799aa106556611cd123a26ff6a23a4057a3b2ff2569dd14605968e76993965b7211c5b7405ff5c89cdcfb36283f7fa82ff1da9e26d0269fac8daf9015b93b3b536c5b00a2c7427e199d9807be9893b67f03a9a1970a1a046887e0a8dcf4e6a2cee57ff26b8a664f6c836b28b20082d0387e02d6d42adb8c5f126668c2292cda1123b85e39ffbd389d832138eaa1500b06f16b0d0e5505c970152194e30f8bc3a2ef01385533daec68f3246ef72956036ba3aead3d62e879dcacb7f505698c6687996ffeeefe7d2a0c3648968aec1e2b864a9b36b8f08211e8178883a27a079fe072f08ca49e5ef1ab910ff56ac7d4db6a0e25457c230cf920acad2698536ad3c6bbea096729e2687057b1d998103c0dde7df3d699a35e5b7a297dcae7d42dc5e6a138adada3247fd200f3060be71eaed95f6e17039650bd67ed21569598bba030ca1063affaef3ad2f17d74d33508a3c74b0a9a536a7c4109ffb9bd1e1ab3ea36555c2522f1cfad903c8a51e91cdff895146b56b83fff4680123b35a193c106e845f575c9b983e338793bddd57a0c46acd9298508e556d242d62cdb45e9c0f9bbdcce45a259ae0ffd57dfeaf85c64351e0cf392c4220a6d10c7e178ef8a88c4c1ad63c131cd92df268301730bcfc01f14882e51e9826b793fdfdf5f14ce7c44c59ed399e3a56ab3ede222dccd25736b85ffbf267efd69be2ad7e07a9b6360dcfee822e70f188722d0443239533c664b51d9d6bf46ccf8087116d5baf8dd6e0077800d84c309d7d749851f45d5f843cc369c00fadee5971af41f9451fdcb24138a1f19b9d3f166d6af9a4ac580b8b38c3ae8f0822640222d3563c611071c5ed0d370566ba597913dc6beed7470d7530b1b8ed213a3e6f37b15983e63f61de57cf0996250af0cb47c8c2cbe374678edd248d14f970fbe3c24a0a35a08b517af001b7fcf8cd9a01a4e909a1247600880a0db14025908498233325773bc70c907bffe93a537d60ef9590641987f23e28bf77550609aba6d5e1b13e79b1990ac9ab8b70e96ccf1c7d685606ea0194b40c68e3fcd64b3da521b770052221807de6c4186166a9d7efed120c978fcdb8380d5be361fcb52b5728831d367f29a8879a61d7eab88a95265b583c44068374cd3f26c23a1c62cf33b8f647c9891733ac9428d675510a6c9dfe5b0489c446a8601bd14bff6f637cb030b4dc60f8b17af638ac775a9339d7a4334cee79d830d735d3186adbc52e733f3fb410d20764d418f3863ed2acc874ca4be1aa47df5c24692638d703df3dfa0c7e7a1f3e9993b8f0e7607b4969532a97dcfd30531b19fc76c331b676881217067428c1403fce556557baeeb389b4146fa043d49680239df3182fa576d48c9d40492c78d029d149f1 + 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark{restore}if +%%EndResource +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 203.04 C +ski{/Helvetica fcd /Helvetica-ISO8859-1 fdf}if +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<53746174696320676174657761792d737769746368696e67206261736564206f6e20636f6e66696775726174696f6e2066696c6573> 146.88 202.08 C +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<47572d535749544348202020bb524f4f54ab202020> 158.16 282.48 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 178.80 t 107.04 384.48 lo 741.84 384.48 lo 741.84 178.80 lo +cp clip np +0.000 0.000 1.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<687474703a2f2f783530302d72656c61792e756e692d74756562696e67656e2e64653a383930312f> 372.96 282.48 C +0.000 0.000 0.000 RGB +<4d> 702.72 282.48 C +<20202020202020202020202020202020202020202020202020bb633d4445ab2020202020> 158.16 312.72 C +0.000 0.000 1.000 RGB +<687474703a2f2f783530302d72656c61792e756e692d74756562696e67656e2e64653a383931312f> 374.16 312.72 C +0.000 0.000 0.000 RGB +<20202020202020202020202020202020202020202020202020bb6c3d44464e2c20633d4445ab2020> 158.16 343.20 C +0.000 0.000 1.000 RGB +<687474703a2f2f616d6269782e6469726563746f72792e64666e2e64653a383838392f> 420.72 343.20 C +gr +%%PageTrailer +rs +%%BoundingBox: 18 18 555 759 +showpage +%%BeginSetup +%%BeginFeature: *PageRegion A4 + a4 +%%EndFeature +%%EndSetup +%%Page: 7 7 +%%BeginPageSetup +/#copies 1 def +sv +90 rotate +1.00 -1.00 sl +18.96 18.00 tl +%%EndPageSetup +%%BoundingBox: (atend) +gs +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.72 537.84 t 66.72 25.20 lo 66.72 25.20 lo 66.72 537.84 lo 66.72 537.84 lo eofill st gr +gs np 66.72 537.84 t 66.72 25.20 lo 68.64 25.20 lo 68.64 537.84 lo 66.72 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.122 0.122 0.122 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 68.64 537.84 t 68.64 25.20 lo 70.80 25.20 lo 70.80 537.84 lo 68.64 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.247 0.247 0.247 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 70.80 537.84 t 70.80 25.20 lo 72.96 25.20 lo 72.96 537.84 lo 70.80 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.373 0.373 0.373 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 72.96 537.84 t 72.96 25.20 lo 75.12 25.20 lo 75.12 537.84 lo 72.96 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.498 0.498 0.498 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 75.12 537.84 t 75.12 25.20 lo 77.28 25.20 lo 77.28 537.84 lo 75.12 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.624 0.624 0.624 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 77.28 537.84 t 77.28 25.20 lo 79.44 25.20 lo 79.44 537.84 lo 77.28 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.749 0.749 0.749 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 79.44 537.84 t 79.44 25.20 lo 81.60 25.20 lo 81.60 537.84 lo 79.44 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 98.88 lo 66.96 98.88 lo 66.96 98.88 lo eofill st gr +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 100.80 lo 66.96 100.80 lo 66.96 98.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.110 0.110 0.110 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 100.80 t 741.60 100.80 lo 741.60 102.72 lo 66.96 102.72 lo 66.96 100.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.220 0.220 0.220 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 102.72 t 741.60 102.72 lo 741.60 104.88 lo 66.96 104.88 lo 66.96 102.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.333 0.333 0.333 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 104.88 t 741.60 104.88 lo 741.60 106.80 lo 66.96 106.80 lo 66.96 104.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.443 0.443 0.443 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 106.80 t 741.60 106.80 lo 741.60 108.72 lo 66.96 108.72 lo 66.96 106.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.553 0.553 0.553 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 108.72 t 741.60 108.72 lo 741.60 110.88 lo 66.96 110.88 lo 66.96 108.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.667 0.667 0.667 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 110.88 t 741.60 110.88 lo 741.60 112.80 lo 66.96 112.80 lo 66.96 110.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.776 0.776 0.776 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 112.80 t 741.60 112.80 lo 741.60 114.96 lo 66.96 114.96 lo 66.96 112.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 494.64 lo 94.08 494.64 lo 94.08 494.64 lo eofill st gr +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 496.56 lo 94.08 496.56 lo 94.08 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 496.56 t 395.52 496.56 lo 395.52 498.72 lo 94.08 498.72 lo 94.08 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 498.72 t 395.52 498.72 lo 395.52 500.64 lo 94.08 500.64 lo 94.08 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 500.64 t 395.52 500.64 lo 395.52 502.80 lo 94.08 502.80 lo 94.08 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 502.80 t 395.52 502.80 lo 395.52 504.72 lo 94.08 504.72 lo 94.08 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 504.72 t 395.52 504.72 lo 395.52 506.88 lo 94.08 506.88 lo 94.08 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 506.88 t 395.52 506.88 lo 395.52 509.04 lo 94.08 509.04 lo 94.08 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 509.04 t 395.52 509.04 lo 395.52 510.96 lo 94.08 510.96 lo 94.08 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 510.96 t 395.52 510.96 lo 395.52 513.12 lo 94.08 513.12 lo 94.08 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 513.12 t 395.52 513.12 lo 395.52 515.04 lo 94.08 515.04 lo 94.08 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 130.08 497.04 t 130.08 513.12 lo 360.00 513.12 lo 360.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Times-Roman fcd /Times-Roman-ISO8859-1 fdf}if +/Times-Roman-ISO8859-1 ff [13.68 0 0 -13.68 0 0] mf sf +<4b757274205370616e6965722c205a44562c20556e69766572736974e4742054fc62696e67656e> 130.08 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 494.64 lo 411.60 494.64 lo 411.60 494.64 lo eofill st gr +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 496.56 lo 411.60 496.56 lo 411.60 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 496.56 t 571.92 496.56 lo 571.92 498.72 lo 411.60 498.72 lo 411.60 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 498.72 t 571.92 498.72 lo 571.92 500.64 lo 411.60 500.64 lo 411.60 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 500.64 t 571.92 500.64 lo 571.92 502.80 lo 411.60 502.80 lo 411.60 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 502.80 t 571.92 502.80 lo 571.92 504.72 lo 411.60 504.72 lo 411.60 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 504.72 t 571.92 504.72 lo 571.92 506.88 lo 411.60 506.88 lo 411.60 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 506.88 t 571.92 506.88 lo 571.92 509.04 lo 411.60 509.04 lo 411.60 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 509.04 t 571.92 509.04 lo 571.92 510.96 lo 411.60 510.96 lo 411.60 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 510.96 t 571.92 510.96 lo 571.92 513.12 lo 411.60 513.12 lo 411.60 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 513.12 t 571.92 513.12 lo 571.92 515.04 lo 411.60 515.04 lo 411.60 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 456.00 497.04 t 456.00 513.12 lo 528.00 513.12 lo 528.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<31382d30312d31393939> 456.00 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 494.64 lo 585.84 494.64 lo 585.84 494.64 lo eofill st gr +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 496.56 lo 585.84 496.56 lo 585.84 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 496.56 t 740.16 496.56 lo 740.16 498.72 lo 585.84 498.72 lo 585.84 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 498.72 t 740.16 498.72 lo 740.16 500.64 lo 585.84 500.64 lo 585.84 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 500.64 t 740.16 500.64 lo 740.16 502.80 lo 585.84 502.80 lo 585.84 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 502.80 t 740.16 502.80 lo 740.16 504.72 lo 585.84 504.72 lo 585.84 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 504.72 t 740.16 504.72 lo 740.16 506.88 lo 585.84 506.88 lo 585.84 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 506.88 t 740.16 506.88 lo 740.16 509.04 lo 585.84 509.04 lo 585.84 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 509.04 t 740.16 509.04 lo 740.16 510.96 lo 585.84 510.96 lo 585.84 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 510.96 t 740.16 510.96 lo 740.16 513.12 lo 585.84 513.12 lo 585.84 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 513.12 t 740.16 513.12 lo 740.16 515.04 lo 585.84 515.04 lo 585.84 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 659.52 497.04 t 659.52 513.12 lo 666.96 513.12 lo 666.96 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<37> 659.52 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 46.80 t 107.04 80.88 lo 741.84 80.88 lo 741.84 46.80 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica-BoldOblique fcd /Helvetica-BoldOblique-ISO8859-1 fdf}if +/Helvetica-BoldOblique-ISO8859-1 ff [28.08 0 0 -28.08 0 0] mf sf +<44796e616d696320476174657761792d537769746368696e67> 229.68 73.92 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 188.64 t 107.04 354.24 lo 741.84 354.24 lo 741.84 188.64 lo +cp clip np +0.000 0.000 0.000 RGB +%%BeginResource: font StarBats +%!PS-AdobeFont-1.0: StarBats 001.000 %%CreationDate: 09.09.98 at 15:50 %%VMusage: 1024 36745 % Generated by Fontographer 4.1 % \(c\) Copyright 1998 Star Division GmbH % ADL: 917 200 0 %%EndComments FontDirectory/StarBats known{/StarBats findfont dup/UniqueID known{dup /UniqueID get 4092170 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 20 dict begin /FontInfo 16 dict dup begin /version (001.000) readonly def /FullName (StarBats) readonly def /FamilyName (StarBats) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -133 def /UnderlineThickness 20 def /Notice (\(c\) Copyright 1998 Star Division GmbH) readonly def /em 1000 def /ascent 917 def /descent 200 def end readonly def /FontName /StarBats def /Encoding 256 array dup 0/.notdef put dup 1/.notdef put dup 2/.notdef put dup 3/glyph140 put dup 4/glyph141 put dup 5/ch5 put dup 6/ch6 put dup 7/.notdef put dup 8/.notdef put dup 9/.notdef put dup 10/.notdef put dup 11/.notdef put dup 12/.notdef put dup 13/.notdef put dup 14/.notdef put dup 15/.notdef put dup 16/.notdef put dup 17/.notdef put dup 18/.notdef put dup 19/.notdef put dup 20/.notdef put dup 21/.notdef put dup 22/.notdef put dup 23/.notdef put dup 24/.notdef put dup 25/.notdef put dup 26/.notdef put dup 27/.notdef put dup 28/.notdef put dup 29/.notdef put dup 30/.notdef put dup 31/.notdef put dup 32/space put dup 33/exclam put dup 34/quotedbl put dup 35/numbersign put dup 36/dollar put dup 37/percent put dup 38/ampersand put dup 39/quotesingle put dup 40/parenleft put dup 41/parenright put dup 42/asterisk put dup 43/plus put dup 44/comma put dup 45/hyphen put dup 46/period put dup 47/slash put dup 48/zero put dup 49/one put dup 50/two put dup 51/three put dup 52/four put dup 53/five put dup 54/six put dup 55/seven put dup 56/eight put dup 57/nine put dup 58/colon put dup 59/semicolon put dup 60/less put dup 61/equal put dup 62/greater put dup 63/question put dup 64/at put dup 65/A put dup 66/B put dup 67/C put dup 68/D put dup 69/E put dup 70/F put dup 71/G put dup 72/H put dup 73/I put dup 74/J put dup 75/K put dup 76/L put dup 77/M put dup 78/N put dup 79/O put dup 80/P put dup 81/Q put dup 82/R put dup 83/S put dup 84/T put dup 85/U put dup 86/V put dup 87/W put dup 88/X put dup 89/Y put dup 90/Z put dup 91/bracketleft put dup 92/backslash put dup 93/bracketright put dup 94/asciicircum put dup 95/underscore put dup 96/grave put dup 97/a put dup 98/b put dup 99/c put dup 100/d put dup 101/e put dup 102/f put dup 103/g put dup 104/h put dup 105/i put dup 106/j put dup 107/k put dup 108/l put dup 109/m put dup 110/n put dup 111/o put dup 112/p put dup 113/q put dup 114/r put dup 115/s put dup 116/t put dup 117/u put dup 118/v put dup 119/w put dup 120/x put dup 121/y put dup 122/z put dup 123/braceleft put dup 124/bar put dup 125/braceright put dup 126/asciitilde put dup 127/.notdef put dup 128/Euro put dup 129/.notdef put dup 130/quotesinglbase put dup 131/florin put dup 132/quotedblbase put dup 133/ellipsis put dup 134/.notdef put dup 135/daggerdbl put dup 136/circumflex put dup 137/perthousand put dup 138/Scaron put dup 139/guilsinglleft put dup 140/OE put dup 141/.notdef put dup 142/.notdef put dup 143/.notdef put dup 144/.notdef put dup 145/quoteleft put dup 146/quoteright put dup 147/quotedblleft put dup 148/quotedblright put dup 149/bullet put dup 150/endash put dup 151/emdash put dup 152/.notdef put dup 153/trademark put dup 154/scaron put dup 155/guilsinglright put dup 156/oe put dup 157/.notdef put dup 158/.notdef put dup 159/.notdef put dup 160/.notdef put dup 161/exclamdown put dup 162/cent put dup 163/sterling put dup 164/currency put dup 165/yen put dup 166/brokenbar put dup 167/section put dup 168/dieresis put dup 169/copyright put dup 170/ordfeminine put dup 171/guillemotleft put dup 172/Tom put dup 173/Pete put dup 174/registered put dup 175/macron put dup 176/degree put dup 177/plusminus put dup 178/twosuperior put dup 179/threesuperior put dup 180/acute put dup 181/mu1 put dup 182/paragraph put dup 183/middot put dup 184/cedilla put dup 185/onesuperior put dup 186/ordmasculine put dup 187/guillemotright put dup 188/onequarter put dup 189/onehalf put dup 190/threequarters put dup 191/questiondown put dup 192/Agrave put dup 193/Aacute put dup 194/Acircumflex put dup 195/Atilde put dup 196/Adieresis put dup 197/Aring put dup 198/AE put dup 199/Ccedilla put dup 200/STARling put dup 201/Idee put dup 202/nbspace put dup 203/Edieresis put dup 204/Igrave put dup 205/Iacute put dup 206/Icircumflex put dup 207/Idieresis put dup 208/Eth put dup 209/Ntilde put dup 210/Ograve put dup 211/Oacute put dup 212/Ocircumflex put dup 213/Otilde put dup 214/Odieresis put dup 215/multiply put dup 216/Oslash put dup 217/Ugrave put dup 218/Uacute put dup 219/Ucircumflex put dup 220/Udieresis put dup 221/Yacute put dup 222/Thorn put dup 223/germandbls put dup 224/agrave put dup 225/aacute put dup 226/acircumflex put dup 227/atilde put dup 228/adieresis put dup 229/aring put dup 230/ae put dup 231/ccedilla put dup 232/egrave put dup 233/eacute put dup 234/ecircumflex put dup 235/edieresis put dup 236/igrave put dup 237/iacute put dup 238/icircumflex put dup 239/idieresis put dup 240/eth put dup 241/ntilde put dup 242/ograve put dup 243/oacute put dup 244/ocircumflex put dup 245/otilde put dup 246/odieresis put dup 247/divide put dup 248/oslash put dup 249/ugrave put dup 250/uacute put dup 251/ucircumflex put dup 252/udieresis put dup 253/yacute put dup 254/thorn put dup 255/uni20AC put readonly def /PaintType 0 def /FontType 1 def /StrokeWidth 0 def /FontMatrix[0.001 0 0 0.001 0 0]readonly def /UniqueID 4092170 def /FontBBox{-12 -210 1083 917}readonly def currentdict end currentfile eexec +d8061d93a824650eefe2785f13cd28a8a226cfb0a1a9915b91e00d2c2cb80ac548a1ab21bed4518a56748942842eff6121b01bc269e7837046266cb27dafd3a4fd0344e68245aa98a5f1b5bc9db554ebffb879f1c082989cf6c044b76f4814df51dcd03f9e3397f3c73d94f85771983bd52fbe6ecbcd9a2cbb7b3636cfb819daa5469925fc89a188732d68c6d06c906d183cb4bd495aed0c41fe6b7333ad90a1674478062c8996476573a0cdad62593c86e4741ecab7b8c75a6bf02971dfdc2c5a2e1c8f74ab1e91315c54e72426da3a62dede611d5967201fe8bfaa5a21c612c0b245fa35c6706b7b9aa3f73ce16604e3109770d367fb30fa663aa8d2b246de733d27174a0b818d54c58c3676435d43949eb9e5e335396296bc3f096fc154616c0b723b0b4a100ed45072f371f77f26e02f1dcc41376638097d79af0a4ddbfc37dd6cb60d0d34ea5a7536c655d95549b8a5a269e7e927c3d89f74b88e17973c2e8d64688089d329abe6b1009c0334d57a6dc34f22efdd933023231fa03fc81093ef255a199448f17d8f67dbc57c38b2fa163b8cef97a6f42e74af55319eb81a6fb9de18810ba9e3659a7144b80aa066a9f386de3030fc4985efffd13c0cab7049a09a71dc1dfa21a1540f4289b13dde08c0d3b4a01fd2bcb4e256b398c94036935bc270713a24c51042bac575ed4827e17e5dc2997753fcee0ecaaca582c85518edc0c3dee2851fa4d2581f7b399f07013ca3d1d4702cc27be134cfa8aa1cbfecac76f1b406b5b3126c3b7b60ec34340aac6433997656b3dcc1af6c8036f051edfc109a493243546721683fe5c0e48790848079c74ea0640c3f9c92cdd22fab8af9b5575a5d1d2cea0f1f715505cb02a1e200cbe4ea5563d0475cb13bda929286f9c11eab10ddd676314996954ae3c94bd14f364d5202e6ddd20b1b4c7abec1c061b2d8a1776577387a2f2dc424f56d44e58b96f91f7b871627089498d76bbc6664e1ebc9b26486cb727d4a5d62fe405324ceb0a5dbf51c9619f2913e4dcea44c5bac49d74bd049f28b83955e13f0fc77d998a307b0bb560757b21e4a982b59cd5723d66952b8a7ad0311ee6874842f454046538c475b86983b4b8d9c00e814009235a058f6d5fca9e8339555518ba2b64ee925cf0944deff5c14069a1ee1de2cadafaa6421f495c21c042690b3a7c9e6a5a137ee005240308e63e0b1d4bead90ec607d19c57ecc24c2ea9b8ed4af8e5ec19575ba230c19156ff9b23915a7b50666ec4b655a2946f97c5013cdfc31825f2c1040fb28bb8876b1accb1fc005010e5e5d061651dc9df17b7bb37c495a37df9659962680951290f3f4168dffb294f83b2a3c423526a97451e2504fc0c819f4d263834ef7c8588ea4d68c98eb5e3ee3c2de20a6da219b3256400a7c745059581d33158a505d5bb07c75bda324c2d8fe34eadb98520c7b82838835e92ddd1d89516478cb1ca795324f802e1f7a5547f671588fc3e5b909f5ab9d573bb0766569a36e89586b7410b76867cad6577022e9be567d1a5578361d83b817fb994758c679fcfd6b22c9fa7c6c76f2a72be566e42167247c831f826d9a10e03874b9747783adece88750be1206a07923cd9fe06b677b61c69a7dd9e0f9dc60771ac529f6adaeee9ee6652cdeca5789c7f242266d86f0154a1984402c720adbc3dc79b6eece6d378555d78873844ba1cf057f385e70474132e0bdfabe169a631e07d12fd21f18736013499081e58d72e9cd451df304a5bf52c1f1723a5ec8b7992d8fa3f33d5be97d4c114fd435a94607f8be09812bc1fa4db028644e2fcef5d86ffb947a14993a93185b054a7cd9ad734c62f2d9ce3c0f9e2e8678bae5b92315f60169aa85d4ae22488cfab72b841374ac3f39966b9e126ad64c0307b54085b6e25d51caef51fecae4c5ddbfb5c29b15cc90ec0795123a84d3c31173b49096d617707d9e192da82493ac9884759115c02ba4686ed464d523aad69167e24e5303ac3eb3da0eebcc420fdc256cc26d466f979c8e637344958f02ba9d3a481693fbf13283d7d276af546abf2f2bb4e6c6f835c97e532bd5b40e8b08eea4441e8a9e03021add36c4fe28180ea466082e4fd7facb03f7abd47c929c4e0d84132835e59f8276ac7fddec7755cba924dd1c97e02691f13f2e159b1e358ef2ba347e2298b0b39f5ffdab57daae22d94ba5064abf716c866b64add8e3981b76a77a3a8be0a462594b9e1257e7940b237875e000c0e23a0841a85da6eb5af931dc0ddfe912285d160f12a66ebc8717fd37c13d20cc132218d31680d596ffbbb2f2805fd931c61693bcbe365f0d19c8fea4ff3eceefe09c5e29b7fde3782b8adf4bb1aa7f89ce01fa59d1322a1ccc4d92705e274bdc287312b23ab830968143efe12c8d4ac45e0c72c11f630eb5ae0c835b7f7d32cf261c20f04b7df8e362cb15cf38c531a3988afc8eb957fcee0364049ccc8d8a6935200970293486bb69db1969a2aeb39829cc4bed803e0c266c77b0dffd349ff9ae8f95558a3977775b1bc2dba5be54800a9e9645155315b062d0b5a0491cf90a66e84b581070f30d5796f71e88db0352432e8df588d25c9c9b2dd12b976618551d5625e357737966d9a15fe3cd9d54bc275b6f5993ecfcfbb373c419e2f8ed32fcd56d30db1345987a445ad259e03053244a1ff80c9343538c74845a907b0480f013289cf475df6c989a81aa5ba904a63db328292553fd4fc3a783fb76ee6ae50be4809ea0aaac9a9ba429c9990eb45affca8587972c54fdd677cd14f81404c77e4358212f44826316a927983c968767e7be1c7a36f308b6cab1648780b4f1a568cbb0ea49f6a6352d6ab18d54d442c176037ad16e18a17d88cd8fda7e86895c89368239f0f75f8c26f850316a328c40efcf316d8829ddb0fb69b250e41b94144e0475acadf63e51f27f6ecb6af4ed78ddce68c055b7a1f78ec1174bf9d67f54838da11655980a909ae1b80a2e6282137c75e49d703e6d5b4be616e62b020a8d08efd14912337a75857920f1d3515ab2771d38d8d8f610c9801d0b0c8d3388c75d211ac4e4c0c491d3b70e1bf1b926a6fabf60487613e76e6f779c4aed60929561ed06c676de7d5052f60db62e446ca4e2775b966f74a2ab55466ecac93c65e48d5e6b88080f24534ca63dd1e6781920be3010f3e9ceb771c5509754ebf963de75b4b9c9116ba7f4e21d9d89d2df167d8c5674b2fa61f49f016b4269e602c6e144de4a382fb7f185dcd82942081d6362f335695587d2ed1071a70bb27d51200a1de03763bec6b2c7a86d8f200505c07f25fc6be9c044110607154cb69efcbfce495dc86dc634e20349712d3754ce99a8b33cc59ce272e39f481b729c878399e51976652b4a525d107ebbd809909ec95f07f2012672601eb9ada5e0b3292d68b6ff8d529a2dcd23f7150d77ba5b1a36701d5954d37ee96501f9efa8e037290f6dca8c024ec0a2ced95b8dcbfea0ddc55dac8ffa55e224d33fdae74502f8f0085fdb5d6d031d34a609db4ed63ceeb285f3697049800bd560e31bfdc6862a49da0ff4b4e84bac9f184e08181c7870058559f826977e851f7dde09163b8b3cc82be8103f7baea3072202ffce888f1bbe37cadb748e2a3b3b53cf38b4336a4eadd0afffd76389b1dd9d067888c4e647b07a7643b81fc08a15872f08f6295eb45e7838021253432f2bdfca6c2a85aa70efea06863d3ebfdc555f41abceb6fc1a5f92448e917ae97706dc04adf0b7bc817c1b93d2f924b118fac5fe6053093401a4676c6d7ce7b4ceae1f5c149b1d8d712d32d56bc8430c210a7124e192e387ed9696df38ac2763e3a065c3ae4726afe9c16b07891bf5243c16add2bf494f9ae8b7566d4ee600a7fcc945d4bdd305daf4df51b1c0222e5594c65af003b51549e0e790ef194943d4accef39419ba173d05788ff822d4e3d4fb5a612fb13292aa377e50a44a6953bb793d0c521c2179012a882b74ece2f79723fb75624ae9c446ba358a3effd738ccb59a856f1bb5afe8635e1033936d58da18ea1f7464758e4647ac03552bcd1be22ef9d4c0f4aea0d7d1c91234ac50d5192bda73b0e63a8303ee284009e6f42c0a8671cbac1c02ac67f096cdb67e83a8d3a8b0e2915fe4e498d50a80892a374cf637cbdc145c2a4a16e0449fd300f7f03b9c80b320addb404d3b7388e5473a6502c74a9d614b21f2526b2e4f9fd9c5adca0f01677b57de5a55d60d9c428c6833d7abb14514926e09bba6b07763aad75d0a934b7c44976be43c289fb238aeff7556183515a5c4b085447922adff5498d29e101a60ff02e893ce8fb8d446874914eb3d3009db46a579d14dfe884d22d9ca5bfde436f4bf334c8c8e73cad66d26b9b711b3a2a3ea84d6864945e529bf59d397ed0acca03a3bb32e470c46cd6639cdae83b4e8e6decd2e8574e1b9361e2600bdccd6c9231ddb2b5981f4148984e0d21d2bc7c54fa7b32144192d32a60bb17520e855b14ea6ba31068d4e209a5add8dd6cec44932063adac2280f985cc70099a1fffb3cdc3134604bb8e50ede70ce9db412a309a21a0541662050f545cf6f2fbb39e9106e83d34dd1a7f9f08b66e68052482a68778687aac8b793ca24cf3d258d7991c4d2c0eb760d1b83dec08277bce87bef9883ff7af63a927a509eb44ffdf2f8f2a529baee6c68478a1f8a10c81fc3fe0a88004843f05d15b34d04149508d7b29ff2b11ad5e150269dd78545f0f57ca1752f6197a8539ab3aef587645b5dda3dbf18060d30c3426f2fff04d9bf22f1591762597d72cd6225f01377293696235f084801440fb9590bf6468e73c11d7de5c7c9899d6a84a9bbe18c8238e117ae4e74ce9c087957935630399f186f4712caa2775ee026f1c9f334bfa2ea897f2cef8f6d2f200bb2fd7d9292c056149cb3091d54be657c5efb690dd7290b7f866330d8b64cdb134019ba3c608bebca348fac2ee3891d54ce18d427de0e8270ca0b19b5cb9ab69ff7bfce6b5c6431fc794f1a2ae04975dfca6d865e38a85d0092b339119f43ee8f11f999ff0132145ef65f2786d9dae9c45dff0ff2195bfc604db64e4da4b681dcb6a3e2be4f691bad02abb6347e7ffb00172df452182679d10029a878d14569825c6df61c229e158f92a6a0e0590722313729ecc3c93a9de9f044e62d3abdf500ea46557e90649aeb8cc582bfb6fa71042b330800d50aebe27e1b7605c3aca1f67c4116d93a1d59d7f9a9d7dacb2c949193b0e901291474ed0f6b746c680b337ccc6adcccddfee2ba9e31f588940931c6d697222b14220ece34f97d640f78eafe33d689d8c5e94ba3eaccb197728d58924f1325c5951246898b2477057915ce4caea524151e7f3cb049441ae88014b89fe7730eed66c4161b2e01d608d977d674edd37527433214b40081ec8a262da3f69f07dd54acc3a8dc5058a927bf7ac5d3ff18e0e526cda9eeacc331cfecac11d2bec5872fdd5cff5f7459a42f263304294b139fd7106149b962873b757a2db3ee8e030a8ea3af3366fa5f3226d9f9de3c48dcc0f701ac74385d2b753e655804a834456e17ee576872bb5e9815bd6ab6a4555ce5fdcfd0b1637357424813dfa6443a46200dbcd46f7a15d342c14e5b99c1e53953283d83e81311eb2537162005d2bc0f18b336e33f7190d4cc4ab8a86f596ac2522b6fe3aec0befaf024e35f811a309c8a03734e432ac4695d977d6fc14c93773edfe0eab4b5a0a6d55b4ccd205086b92107a434b119d15f145d0f3511f823e69a4b3777b659555f06116cd99075982c200e36eff85d7931c7b918af5504bb4129cf65c8a33964b3b6fd3b2340fd3737c73f7667632cbf81535b88096e99a5e98ffee00409948eb2b46010a275ffdf345bc0e359ae4c2b6b804a36ec5018db1ddfd43ed28e0982be3dd61a41fc78221bfaf4eea3c94e8819e2d296a355bf61cc29ad69e2baa9caa77f4587be6bccfb178d553bb99bdf52716e6a8e2626505b819cc595f5173d13340fde8dbb4db3313a66348c8cf5fddfe7d7fd04becc8fec0ee1385ce5329088e772f1939fd59e2dce71c2946044fdcd131e06695ebfe5ae6e512640d0ea79492c20880391bffb1b3c9851cfba1b5b16d5860baa2a2b1f4e0a571aa3551cd73256e171c2590687e3596108defc56ca6cefb27095380b0bfff828d897c5f4a1f7710cc1fbe37ce9254c27edb772093e789a7e2a941d676fa8f14edf641dcb06fbd638e74a3764be77ccb7f93b5f961be59a6df0c5305b6ab3a20ead2d3eadd749fff40762a25833c9efbe377d2aae40b18e7785a77f9eb4f05f987ac7572854859f5fc5f56240e94305543baf5df3fb905a1122d20d09d7133923783f4d1e30ce9bc990e1d4989280cdcae75b5a78ff48ec68254373f9a57663255c0d5a18bc78b3cf2002befdf0cbb3cb5e76243b963e16ef7a34a06016dbd728117ed141ce213dae5acc96930ef9320938084dec3f77ee4e595b496648896de03deef6fcf49f6477a04a0b190fa668ecb8dec555db55d7ba7d0151042dd4f205e50f53ca706d93c9ae1b67b51989ad1b3ebb27f2416588397429d2129bfe0d5fbc7888fe0ca49754024224ba6fbd089214122d5c5dfacf7fe314c34581b80fe2f0786f7a70788a1dc27bce9f69daf04f197e9fe3f735a339f6f88067636e23559d1a02cd1d8b70fb07146532a5b404a4491d8650a22ed0f49088e86054e76656f079074ae121f5039c5a128109551c3ad7bfb874de16f639a82f0cae1ba1e26cb21bb8ab0ffd0fdda61da950d00e9a9d319c32757cceb80c07716cecf71f96dc167d760bcb54c8c41387d7fb8b5f884a0f7f53acced99690e1316a8f2005edcce538b3b511a637736a08c932fe9f54e281535c9ebe5716228cef9648813df7f0ce70b5107833eb4025e11f93aa574ca8215ce3dc6a5069f03f22a2224d9d2f8c819714b3b02f32066785f9aaf616afa69a3c031f1d1ece51d541f60d6b8e739b63b0f6472b93e5e34cbca3474b47deec1d72ddf91baaafa42078c177469e8099ef4a80758225c7839a0ba643dc3c88fb01ca0f278f077675f0f3bf3319931f129dbd9ef04dd0daa8cf8bc6573b6b2091b64326a366df67a739f27f8c20f47ea3bea9a9880b0aa3b558c56f6596b0f51b124b78b717336142cc03823f2d75c0ad84c09868cbd0dcfae4ccf37b345a26d5e08b20c36505447042ee2ce81f450a835d7e0b679c0c9eae37ef6982001a8c52708c5db0ec2294a90b9876eb789ab09af859a0a879cc27d2f52dde9e9a6960fca2530244cc26d3a21cb294458d707dbe2441460d79d1783fb334a3d144339bdd635b676a1b260f5969bf089d59a526f56bdcf92bbb2d52cb268ccca6c66e4ceefa57c72cbdf8a4e1a2b57ff356f8fa49db680fdbaa3d4df9f1d6201307a44a9ebef9ab8c893518d71beceba645d6df155f6aa68163f8d66b40c1084b673ac16b287f763d40db303c4c9f9e76a3e8fff77d595e97f7e59e56b02aa8f005d0c6830931892207e25a11520efbce320b99362de47e093fdd48318cef9458ab6b4093d1480ab1424e82695527412d0c5e3c299eac02b67ee503a9d04d31431d172f50666fa59e778dc43ffb7eb3f78324a5cd88601f7109bf3bc03f0256ec90473715c9a626a8488a4ac0403438c7fb97438334506f3718c262c6fb671cc1501e1616281c50c1f1abb0e796b5a989d9419e9146784619689562ee006255b58c5030d4deb7bd4e723d5dddced22c58905adb6a1b319ff10a8610912023c965c87e8b9f50babf746950ca2b356c1a9cc1cb8180a3536b2a639a147f65a8178fbe711c5fffb8fba62069c74e02ee7bb219bde7f581ed080e33ada55e37013823fbe5eaf8f7b774209a75b047e7626b8b82733f525e57792ca6c79bd882c5bfa323fc5ed98227c892ff958a359fcf654cb8facb6827d717a899ab9b4d2093e7a3762ba0c9f7ad55124173a5bb29f9f8769484f698dc8f8b394816dd74eff3b1a7dbdf16096bd0ad1b5bd409d56783b6d418631be43d241d6b834e1e8107bd9e296f9aa43e90ef753d6ad527875f230f6b1d3914692840fd51e8048ef5ecc8e7d2da90645c8e0acbdb3803d677cb07714a5fbaf0caa48234e6abfd0cc1be8a80ea7e956ec40a54ce712c979d9d108c28566d3c71c93c25fd7c202c637aa06f1baa00ed6262f87062cbc03e7722983a7c87645ad8d6e0df84112139cd220b03e3b874dea9b9705efa254db06927ab7951eb72ea84b253e0bb877b77fb1810b078ba9f20280d7e85fd9d134ee7166cb1cd51525a5bde7cf96b26569af11b40dbf5b4b25a662c9e14dc084cc349bf451cc976d1de3ef735d001c18d7e6027fdba88d29016ba395ab7f6b1d232151acca1ee234a287c2d7843223db3df6e3e5325a9fc82d92b0baa4a28fc927a3c3d307f7a7ca1ec7a54e8b4a56c177aedb633425bc7676a10c0c2d51b5555f4757c2c9908cf39eee8f85913216c5df40fc6a04dc460e99f55844700b4e02ef7a81ddf4bfa798e5ea327d2c66db67c608afb6ea5753ade25c620d52a5ff2c1d43385737d41e7e6cc645b1f9dffacdc0e8cf72a9128abd66cfe77f2c273e7efb2c6d3ddf4848a023911b7287797cb7a3baff8df5f4d8baf2d30d8ef3daa330fe4728f2fc405bf82b6360d1c9f78d17fe13bad721756ec2bba578702ab8a41c094b22a2ea393e9d4d597e5d0c2f12ab5f21d4546ac61e0b96ad5bc47586bd42edd8caf964cd2b997e0bd816ffd593d5481a8ab543384f8090d7cc0d9d4dba9001992366bbd61949f2b33bb6633f45554e879ec6399f11a13be5d195c927f9e4fb503c2f7f1af69725add00166a3c6f0b72230416d09687ac6109eb06d16b8321ab293cc112cccae7bd8233a6206b814694eb0057b708a76f7c793115dbd09b6b6808cddd0dccbc2a20c5abd02a91f0846ac0856a5cf7be1319057e48631937a3bfff2d24f0fecb55e929c1c7d8dfddf2fb892926e20c9fe4a84bc1d9dfd203d438a7f989ba23836bd55b1089bcaadbbbf19e8cf001f75059a1dc3daace5ef08b0b55231f3b63ccbcb50805601c86e10e48f90dbae123b55d421df8301a9c67f4cdead045d1ace302b93f9337ada9ed3ea36369cf35577e868383d69cd425ece04e0cdc1940b296c35e1314d837d6fa900d661eed125ada136ae005179a03494e23a245d96e60cbd7a04f9503c227e835e58935e28bdba5446128f0db08dcd9b85049c5c67e357a3a511f37a71df23c25f971df40b9982b1b5ab845bd4870fbcdf4ea319afa2e225dcbe3b4b06b73429467ab402aeb48e3b661a0355cdeefdb754d43b66d1b576a1ec93994587b16fef1d493d53263ba10fae3dd01736b479e33dcf87dd9af58b353bc55b8a5382aff065773ca8e932d8e55a80537dc04193176a1c38082e3d4fbc38ffbac68bfcbd80ea1682b79961ca070d3f7938571303267b2be5afc70f196383a01fabd8952db19f7c5921fd66ef6f44523adb1bb09ed0cd03c14b8fa91b088ecc5152d6e288f2f388b5870733b489081581fcdc2e1483d3a2dd9b1bfabe1732b2ae37041d49727a2bde007820f328cc2118b610793e6a6996e1f336a061eef6b61120049fd0b9f0847409cb3a8ab404c563c1769de2660b073dcb30bb916f3679b5819958ce2f5330634e2361cff5c0915861ec791b0dedf34a845103f7e1041a366e6109b88bcdfea2e0d0d260f16717d67e20c9a0b624f15f1f05339a408dbc7fa3b8395895bf50691bbeaccbfe69bc22e136a37fb9d074d668eaaa2f98af8ee35119d46af0dd9939462cfd2ddeb85792ca7d38d61e2c5109d2c91fc8232503900396ae6a85b7a88c80136699e77c0d7408eb88538cc544a3db250e2bcccbfa8076d70b026d46cefa250c128f8ab95d1ed9f028d56b01489d81da013201747b80513f318b84fca9dd1c4d65f36a82d09d847d550e1854341338456714e0a93424e6146e34994f84cc6bee325ae41d716920dcc0bfec62368546c901a8d43bf94c9bd2cb56283888ca54b758135fbff776c9fa98d50271b172889414b7e948180c03700d2cf3ebf390f0f9c8985900a76be9171f7439c60e18a0db5a46983722ff1489f77d24f2112b9035e65cfd10fe4c560426e464b6759ae5f24116d16f9a3167eadd85389114535f44f8054d463c1b8bab08779d40b74ee854aa6d652aaf40c30d63622eda14aacdbc002c0891abcc764b676a3b049deaf49d6789c7f9cb12bb6f0d1619548bc12b6df69c98a4af5b085c76966b116d6a2cffe4a00733efe59a473985d5602319fab0f04dc3a55be53e9c87726d6ace09dd8343e3e111858a3ae45b35de08b1730fc628265f0afcd3924b9c143450128aaf68f41fd5bd4aedfaa9411bd33032a81405dc45005c62b682112ce0952e1926a47571a8790d639580797e33f991aa9c0b7178448591f044dc794e31acd413e6ec84b3ec0ac0df66e08e9a89727f91620f3f18f9238ada2abf4557d72553f01bebdf62bdf5742d25b47def93114918c643aa2bf8761441ba5e6699760f9370b5c29545606f6003e4c6e4725dbe4078b416022b20c1d2aa30d0dcbb724783777fcae6d2487bb793e9435218f93573064f47408d08a9c39bc44caa91c24177e8283e59cb9be2c46c5329b150478beed8c6e1e35bf56c3becbcadaef963bbc70128a1518c635420921fb37e2252910e270692e8bd641832740d67f2174ff3171ac73c23512bb0682a305899af28fce475f399ffcb310dd96cd469fbbb7629fbceccfc497fc2e469a14943fbd5c4d24c8c89b66f6638daa38cbf9dcb49dcf016d768acdf758356834503afa00b7f5c8116e147c5397c2aa8ec8a241bb2a5dcfd45627821a79dee1ad9b162796b53c59e3938c94a2a531b737b7d108b9f1f42a2164027e7d3922858aa7931dc0f7e0ec8e0fc30c27d4722a4d083115c916da5976680da42e3a7fdbcb8084abde4d1f95f62a2291847c4358cfe83b13b9ec2f1378f75f787b2b573a027b24e9eb8a47188be809666df8772e43672f910eeb1c23355987358a1bf34c3a88c2647a46eb85c1429e2e5123acfce3504e0ccf4b89e9b3de548e2bc16b8e765bb53568070a17b23aee93b0988b67e10dca6129f19083a22e950a6beaffbf958a232d2b40a7966f96d8d6c1d30d4e9d42ee28dbcf0bfde533a8b5c07c32c90c634bbb90471c53658d596fd066db06cf96e76f5563b2dbf17c284fb88a7e389b9340cb17c0707caee7791234d4b9cdc0406a59ad5aa3ebe06c7ac21851139171b188bbe7b43422e3847e30014dc2f4966126c2d23e1d54d0db34fb2f415347f14ccdb4f533d2f4ccfeae45f21b027cda966933daa5732464d7e125f32b05447fe1d15170654b53a5fc3ee1d2d8427096d1f71f2bfa3e240740c879ab752f0b14d1d17fd880f05d65ff64a05bc08f69d97fb63dd78346b9ca038d79764cabd013d57fb3506d4b0ccef1c92bbd704aaba9cb912e6034ec9ab77210531c9a1266c272ce3261dde19b9a574fe5a7a031416011100ef594396adaed9f884d18173f0fbf256e47d5c57a47864a3d592c2324c39bb6b9f8cd770e23e5884fbfc119eace855f4f21356a57f912c9e27fcd292534cf2ce0e0490aca08b4df6a3faa614239252279fd2c3df91e054129e1ba23fd9b7a90ed0cbc1f9f8790ebb11bec7b0b07a228054e1f8bb4241ab3a66bb6a224bafa455ebf835e5cc1b0f7701e2e64190091a577dd835afc77e72f3970721e1b6fd64ed65abe1b7376eb58e3273254b2da264df7a97286ac43f1c55f1b50710f54cf02da4023260084aa143dff539c5c7d5951767d0ca6b48d5ae8dcfd1727774ad1c5e7273c2aa5076c0a0fa3ff8f1bdd088fbfc17040808f3bbaa83a228b573694aa171d4fcdf13185e0a010788698eba537240a9ee729d7af975b4a8637901fa3aa401cee44a0940b4378ec67b101784d07fea844a50c542fe2a3e01bda791c2ba0ea9879bb298b7883e1b8ee13a88f9dd3b28813baed3f97c29bc8b9b2a0bdfd03df29f826498abe20f8bb7ef6be2930377c56430b7b0ffafa4193998c32fb12ab1ff63695a3201e227698fa8fcdb065c9c3a82d2f0b8a78ddc9afd5a1c5b135b019c22a46d8401559149293420d91aa98397741e9cf6bd30134bd8b5f3c5a1889e5cdb61aeb0f8a052417c5dcc3eda52fd90b2a8c2ade1a0cba31ccc88a78e1573f68ec6104fab6c417c631e90bb9ee10daba4cc047ce30b2eb735ec694521b7a87edf3e15fbacc941269090845894eacc56321d38ebd3bf3bdcffe80e3b21e4683736c81a61ced165e3a2fa10b969ddfa1f55d340612e7550144aa43868d2ce06491f2e5e089b1fb3880c17b6040343b795832e1638791ab2d12b1df0ae253aa1b3e9fe01bb06f7f306c7468bdb397cf4a9977caeb0a3c95adcceb5161f95c985b08d5d703bdd011d2d4a38f16795b54058fa2183ce076cff0762b3ebf56d8d8d0fafdd508449a2f5b0a8692eabfa509dcd0b38f09f4f99e56a0044c61c067a107857dac52e1a364ea053dcb290a7cc1c78420bf502fcd56c804c8729871aae4a4752eda8c1f78de3419afae90eccdc7572a00deb5e1a90d1b8676ac638f011b18cf42c99264d350b77a64a09c433a470f3a2ea988348f59abaa12a1384b0558890e955f1f385c05c740a0b44bb51e9cddd91bdc46c8804eca94cbf9e0fb0c18b770b70f81fe5c9c6554b3a781b22665de565d08fe0b3bf6a57943888d387c19c296827e60eb6b81685016bd1b1c8d95b29eb8c335fd76b208dbd5054b22e1fc0ab4743f7b95d623ca64c9f9afd5285978bc5635a54a70aa16e736372ed027e9518a4d0d0f9951996b210830e6d46ce43272dd0923483f986349321b2184555b6a6573bced5fc778d682085d1970f05cdbe85c936a4634c9821776b4ca2e8dbadf3715228a73c71aaa271ad02bdd76a00aca5bbd2036ef7bf949814e76561a22c2f2ebcc43c7f4af62f5a40e2df2ba612e77adaf6715e1c980aec44b1164ea20020dcb5d9fb7072052e733a0a5b69d175ba8cf48b780b371575e490571e05b3fbff92f1e0fb87abfb18f4f81c8838d5bb155942adcf8911fc3926a22d60bc9037d8eb026ea975c00937d79432be5e791ff1265b396443813020ad11f0e0ee66bcc4d68aca9ebc2b4b8aff28de824007d9d9d00a12ee894e55c565f957f5f0cff21e1219c0badbc99de37c17efaabbbdfa903ca892d5a99a7201813a2ca9cbf7b5d19d779c82af7a1be51cce30ff3820448d2e10b39154573358bb6376ce5413267f6de7d7cfcb8d4d9aeed7a0f6648834b1452c58f397ea28dba8cadd4ef29382d757b78649c6436aa3e38505e1543fad8d22a415f8c0b6afa7bf16cbe0aa85eb9042f0757c8f3ce4e0d432b2b0a328ab69529c5f8bf8da11b0b354858df07e4644aeda913eaec05fdc24b95f6f4307741897662f347ff5785bcb06c0aca0ea708cfee767f385962de34b05f897242256c1eaf5fd9382fa9f07c3b2acc2d0193cc7688fa71448b4374cc3805cec6e7b503a693be2438fb03037d7a70088dc9fe10ac37c84d29c8b5f04648bc23c998872af1df21a88cee43d52ab580248f6d11c0896d25c4ec8068afc138518f52a23c9c8ae8dfba103cc49368a2ba7a6111a8d0e154d007cecd32d9a71c3341ee238d7664d39a263ce2d5efefe4065c1654c4996e5eb10397d78ab6ad8155ab5c815707655d2a85a00187f8ed16ca19f0fbc8c116417420666e9edabb192cb81fc6e2a4fdf00bcbe0ab582a63de69af3d7e7c6ec7f23c09f02a81a221ca2d2edaa751bfd3949ecc3e81d6f518453b47911b0aa13ff53dd8a4af4b6d8f40cf4ed2f5c3e700749aa3211aab791b9e9e899b4e53f3cf1d1c62bbdc06ae2ac394be1a9694858919da321123184a8a07d01e084655b974e8ae6919709ffcc4826f62b6a5dd420b784eb881ae6e682b292d2e575a28eec33e21afe2fe17e024829ed46bb4babce2e65d97a656feae5f5bcd3f10312a5a102bac3e502a468c382349d47b6e7fc4435a8c56d61ca2c33d93ded9f2165c1f640cd23b0f36e64adfd4c5afcba0fe8cab87ba2040efc0c2f00d3fbab933303b1c34f15a60158e5ebf5c82ed18c84c54babe8e1e4910921d3cf829cad909acef813f174ea65802614fb567944b14630d1e4b063c49637e7110a2ca6de4f34935866b3ff0c3643014aba7f8ce5b2701abc1e0f9caa048e7d8fb937bff1c0319a1de8f126a16740d7f0a8833b60b56864f98ea428e2f105ceff6dd30a16bd24da9f75dea0f4ce864bd44bc52b73057527b73f35a7f9e7bfdde6435e68fdd781e82b69b22c09b139b35b5a47a385ecf05cbf2152cb5c686616f81585bafa01d067a5a086cee61113870dfa9bda1b2eb1975403b994e4669b30bd5354784b1c5126ea7313e3230fbab806e8cc7411149ac52029430ce0be92453dd7cb39026ef26451d2f230392670bdc181a0d0b24267d08861c5e5e0d00d85b84a0873c02f678f2522eb8bdb04c2624256e79396404f475be988e4ccdca00ff9c4aa86cc48ac5f05d2ff1ae536c5f576d719862d44049edeb7d25c2e78e328bff60bc1f09db639c10486d65a8da9638080ab92b3c9af7799a8149cc771857f3d36a495fd7e58236beccd8ecb68aa4fdd1f8b3fc21796e7327e0eb730e0cf78567e40a8c0842dc3a9f7451f347af2375ef47b560bf6f9cdc8e682ae9574b9d7c9cb4c764ee84a22303a35b49568d8dc89f74c0447b0f263ec71e4acc6de6e6116085b7edbb61ca4b198e2af4dba714c3fe6b9c821ca1880eb1b896b01d086e80a43ddc9619789c75ca44f8dc9d4013ed4d10c50976201e6f020d6993d42fc902b299000581b04d1db1a4c548a774fff638bccb298f45bd0a30ac11a107e6b9042c41634732855c7431610456d2d163129166cf90feb8df5a72ad9ca31a8613ca3df539f599996904716878028bd884b1a8d75fd0d3fcc6dd8e007f6f9761ba55a00fa6799b6a3ea67a6a55ff8843cfda811582ef1b553b27c05331aae09b5a46aab96566568153afaebb7b4ae5e71f7cfa6fe08aaa52aea18d1551068e25942f623c4b8e8a56f46e352cafe4885dcb1eb19c458580d2049ffd77af8380ff452acf5ab88fd52d7ef112c29ff6464e62465398fafd06ef81bd3fc2b4feecc6f45f0146c96d4a7c0f90e861a1d433c5deac14a019f50511d6ae9f363952c0ba815bbb3774c97c16038e82e39b76bd15f58f6c693a973d1cfcfdfd65ff61efd3d6ded93c3aef8a715097e97d24ddc94ba972fdd68c732e1a9001f3fcc1a71f1f9fcc1b98637899fdb949c281d858130712d5d5408f0208d62f5cd7f81dda2649edca15790c87cd4e24ba48a7ae328822f5a21e57f6fc5a6fcc71d532ca6817f6eea89f76b60e4fc7bd243c2d2163b46ec46ae4be40764f95d1a51efe6f6d8274b668c50cf1de75ca2b4791dbca7c9232d147d568cfeba0b44caf8154bd09fe8a55a8bf1bb1afa95226a827167b13f33b924ca637182b0bac8b56e03327986568016841bd25cfc769000a7c746b2d930d291ea94f371563b92535003c4bec0bea1b134915286a1665b643bd011015ef04ac9d5abd487c0c4d3c6b20a00646b476e518fc0b008960148a123365cb40be362b3b1694a8d5c05d23b018370f616496a52c2cd25021c3795baf897f812f62a5a5721ac8170e79b49cdf906bf71c83af3c445a82a9b0979506e7df0fff03405f717f51c69c995d11456b03cd8bf9395d33fbb127e4cf9d8fc8411a26d42617ff2d64e886ba9fe5c7d5b85b43fc4faf88e7b4eba7145234769d58d53a5c07d1468693b0f93bac6e2cf5a931b11506f556484824d227e448c0a3805f2217f136c1a7d56f3421588e286adec32d32422b95ce8fd81eda1c3e9beed20f03cbe487fdf2d65f59add2bce47cb5f225b2c6c09100225b4276d3cb5b6792be4b8f0489bb750f1188f371880930d79cca6b09b2e3f303f766081097bfbc5e538d3cd4ebf27befc9132225dd7428d444c764860a262e95221f0f1fe57f5ef3e4432d2be9b3c9954a88e58cb329ce9cd37f4fc8494ad1cef800a7bba8d2ce486f7ebd7a5bc9dc73458bda9e4c46c6297469cb8d4e3877ea8db014c04ebd313c6b1ab74abb69b03334d562422a6529b8e68f4262dd3ff05acf1c6d0074d35e4e977c665a26f86d6bae2c4d64114ecfb334c4d575adab7905729ecc6345e3726d7f2c361ab9d75de26315cfeeafcba9bff88c0ce812554b1c6ab0c5765c5618f1bd8dcde547b86af905406ea216e4eb454e59a835fd9648dc5c8c9da88d7a753a2516b50d93e7226868bd0c4c6c2eafa7a0696a8ac2f0f3e6958efc1e6504032b42962ba6eb3c5bf856cbc6bb090d481489c42a8e6d5721b6cc02b34d6650157752126de0cac4c31b7b073e2d6d546476682be55d764f5bb3154d70dfa9244a6fe5580db958e4a766f95a61987102d67707838b177d10d116ad56368c48e815b30fef5fd6554acfc0d9e64d3c4f6b8e9b8ef6af2e09c6126a92f0865045cf97c94070d2fa013be48df5e50bbadd9062fb6183b147f7dede8b571826f81d546abddf5de4f95a97bb75200ef5dec4abef4950b587763db4fcd61017a457c00230cb8aec3bd775980ba70362b6e8d064f81062eabc6149c115feca46efab3b703e76a9241c72f6b6810adda98e1baf07d6a7d8189f6ec869b54941c40080a91980fb827c61c1f7399539387fbec2d1d46a54b1f518859b3a385ca098b86039bba25d2e49b7968281e3e1c3e5c48f2012680d81ccedf131a8c8891b4134bdcfc70854fc7787d03671c9e55185793ff6926ae12f1dfe8cf246fcd33d88d159842e8dfc7c257836c98752b7152039eecefadd80ff76e816146635ed2d36fbcce101eee7daf1515676b9a2b203e1cfc8859d128852e25f9cf924c16d4a47272e495645a6dfde91cfeb39f4e6a1613a901e2bab7c975c885f6424b617475aceb396d0d3da14c102a69987f66f38599c60210dcebeddd8bbc80aefadb225df56b7f48d1ab0a8c92584a41b9fa726a7de8620cd32472c1b89ee1cd0e3da8b595f98672343417f766bd8d9c52f3cc1a9bd6e1c8c1e588c023ac6e5355e68aec6bcc303577faa7bff293265f9506c6107432145deedef7b254d5890c755a39f5b3aee4364373a931e98d5ec011d247fa9ef17a68b2df72810929a628f6ae634f4427c1538dd02e1c9962f33273cb6add06c81d6258de794f09700a9c8b2b6c3a30eeb00ece206d70dca75beff10e9619d80bf0a7d93f24cc82b33640aa992945eac34fff30584801e2ca0fde10854ec1c60cc5c4bf08753009063e7efe7e07a94cce2de1d2add68f2abf5e6fedeb161beb5cbac9ad02c043d3d157acf018751e1140776a7f32d71f34c05cbcdc9c08a7c7a03f596dd7164540566fc54fc1fdc2b23b14f002eff9066b55e30040ff5ac54b8fb6d9d643f939aca40e5005f1d5972feafcaa34f2a72d6ee03ed74fa5e70faa11ad4e8ad2d0f788900aba49c29090a73b3432d9ab5d933c115abe4718cc9e2a2d770e9cdc735ad5991455ee0496b0ef2465e39267af0e36c30da7f3ace53cf3f6010679001e39f6e2a55da65870e9793b447b418ea1e519dca3c2bf0e1d0b0b07ad96a0708f428173694f70a113c0a0f79b3251914d7f8af58d59d6e198bdd6155cc3a4468be06e0af9a1c94c488c9fc6b44e759e43695c0873c1415fbf56c065a3ed585a790bf38784ff3cd7baf3f4b22533d735684bbde582438d213bae7dffaf897289cd0052d6788718be4e3b7c071d3c6c7b75f6e0ff3437e48217e179e35db0f088e80c8aea5749c71fec4985d00647877c9db4a55b51f07198c232adae969c821be6ee6c2b1ebdadb00a8916b1f93b1724775ba9efb421df723d54cf22caeeaa1b6cc7567a4279647a6e099cfe285cb30cea5a1019f43cca22765a15759f20dd681057a0832833c15c54cb1e3f0196aff51abc2b0ccdf37edab8b536c2a4bb072293224e9d4e83ed427b8ab2b92f52a3fa6bc28269618922a022f67f778779bbd3d164aed6747c9639f1628a6643f47dee03112facf7431bfa1954ab2d58c7b02ee380b86bec76fb52093fa5419c17f20b123ef0b0b5c0efded93f18e2c0aef25c1665c3f91a3f7faf4dae9cbd84efd9ec0a5ac4521051118c1e28dc3282be83918c9b23e06363782ad6d6e99f69a016153f70845309cb9d8e85d0ef65aabb02b0648665ae39d5ca7ae9c4de2cb940ad8e9b5e0e59ebf2298c6e16fe35886fbbeecc719f000d9c9764f3f90f66c8f9a243bb25bf84ff7cafb76be8418da346319798866bda42213d5acf00d836b2a0487b7fef2fed4cddf10633bc7f2fc2c0e7e7c8785b9bc1eee0d2d5ba42fafd5360f9c84c1a9fcf8a76ad2916c31d66257c39a760621cd0ae7b4189e051036acd5aaded0acf934fef24fe71a14cadf03afd4b7c1752e0c2890930d3f74b2674bd6135555911face869062ba346fb8bfc45d09f224e69273d4d00d5451ba213c798811eac1b8fdbe4631313aa8e35ab728a1bb9db3c806c46db222980828ecc596b8a081368d73f184401ade2b7f6debae497ef70b13d2aba139f22f233b4299ebec79ec32f868786c60171f0633ba142938699a702eb57a26d9d6b2e955a90f1020e798b3903e9d9dd8f8c98888081174469697170c38d5737a58c8258c8a9361d270357e51b67011ebd39578f6963f18bd050d014b592dc375e006cd02405623bb724b1dade6b3cc632db58ea103ca4a3d939dee5df3307dcbbb3e3d0079fe70c6acfa53430f31075b1ce444454ab8208bc4dd2b71d3d8dec8bc4d49797d2bb3f6b35338e9f1100b6c079f327a639e33cc262fad9b18fb3746829af4c08ad4a84baf08f6cd31070997c6d4b78fce290807a05914db726d20735e0e7058f73856aba4dc8642c0fd52314e856f32e5d0dc7edb7fcf7c5d04e2fea3af94ebff28fa8e886d756049f0e8a4c2d22c94866366ab8b0350e1bab7094ed1337ce3002463e49fc894ccbfd05f133ab0500da55ee616f23b36a748c528ee8e2b792eaf869e606de86d3eb0a7822b7bcef21c010695c05adf371a88b0b36981910ce1317560bf020004077dba0bb55f26249beaa36e7da60d783cf89345b38e3c1b5928b9dcb5a677ec98cd4acdcf960d3ffd40e86c6fa43ffc198c2bb1ba99fc5fed92714591730fbc7a64ab5ef06e18b5f18bd37fa9c3d954239d6dcbba27c3081eb7944d53428bdfa189a83db26d864dfb4bd729a2ea41ec866b8814d8a0664f0dbfaad60dd54ec7c61358ebc416a6bf798fc65c408e48c785e9a0746548fa593858cdd067ae1e0b5a35e49a338dffb1aaba512f5fda377b8f3f4aa6c76f2d33a6d4fa73169a9a2cddbe44b49075efccb37acd99774e63769ae150647f354f0b4b93ff3028c66de35f1d715146cf5d5c1a854b45bb38a5fa45aa211f988b4c9daf94f61ceafbd989d168439c63b388672d2b0bf170b037e5c38e89df56f80d7c6645d7c045f4118fc79b7c667e0072500d627eac7bd3a17614934e238c2f575f4a978fd53246da9d3df02a28b9291cc09a71361b010d1605e86f4f58298cec9be2f7e17aedcecd5d87d7302b2290f1313eff056b100ff9890dd989f495182e2532c691d96aa97dbb2ce6481a0f76b4e26fcd97a02996c39347f90aadad5c4a65e62f9ba6f37fea8df342d5c6cdda448bbe7dfc4a461fa8cbe1c2dc0a78abcaa67129b998e6f9a913a6e7c84e36b936f4db32f000d06bcfe8ae2d5fac04cf45bf3fd3f117bb0b3da685e109a82f200a1e0d7f8522332e5524a3fbc6e864a86f9fbe30558b3263847d890afc1b64e835e1526ebf69d743a13717163fad0f9e058816a176051dac15dd0b7e2f0ece4d367abdb72a339898575595bad4acc3b46b597db68a5b6141f850d243fbe0b3cc113bf7eb27fe4359ddfc4ff3ef16bc7acaa0f3524f310679c03333d3fcaaf2e7507ba98f8dd1b770f36e426250b1ff8a9d4bc25c463ba8a7630a582aea3252e0ec28d656063d6177f74b1c88d457bf9059895e570cecdd6fa724d2015eca9c76ddae2798f82a181582723d0bd2fe875792e22bbd67b111812ef40703d6186261d6be2747c72746960fab45840f4ff6907949f20902b065fdee98d2c13ba04152bbc70eb415b14e172b028771339fb0ca708bf580bd2fb6a6d6efc0990ba5d213fa95f2efdd8b1c1b699841b8e154451c5de23871b54be129af8e3043ec5780cc395f325d33c4d932a30171ad6c362281b895db4b604d1d097b8f4162bca2f6da265e7a2d1130043a9d21c95effcca1ef06d47c6bbb7860392e5b77d17706b5accad18e8bd19ee8ab2e950a5d8f6789119a4dcb02ce64ad5fd29879e948be85c8c35669a06b2fef4fc27ad44a3a5cffff063f9268ba3b8c54a777bb750eac7e3f3ee767a4eeacb1b7019d3eac82fe5f943bd042063df081da663ad14e7f4661e550e495f413002a6d3eab63e159baaeb60fb7766baabab0d22b82221bc37ed6ca672ad60102c15d040e6085a1f4fe67bcf63da0a15205892a04dad9b3ea918adf24d6479fd16e935badebd0aeae1cb6d505ffc29abfff2708db39d1ff6420288b3b779d291e3ac4b944512eca4f63f4e1069281a089d91d3363d15975ffdd1b103e4e2c163bbeb915a5d08454857a9d29d24b72a7e7df6e3a7e90ed517abc95a448aa0179959285247f17cc8d0532fb13738a6a21738ebec71e2e68c55d8a8b77d456b385408650e627970ef13765744f4a72e4990912186a403f71bf2a9b8ac7211a0499266466c65de65157d36302cde084d348ba46da3efc430677bb5b34f75f39f16bc710dbe9c4a4869cc6e820ffc59239b1049720bc24f5e59395f0f0f153bdbf207df37311e0d85db2906f70645c876c000583812026239a535cc06a4a6c2201b19560bf574825662aaea2dfcfb3551752e89459e4082e9196dfbe1251fdb94b9f997689be8e8609d4d78fade40844bbad5caff8a07376bd83a13141c14d0ce0eb0a9b2e621cd7e031660970aa4be5f7dcb5d15c2bd2ede463c6fb2bb6bc1abcfcd7a1af96f1ae98ae81d315af3713d000ab889760c12443ac5fa79a48fafb39bef31b3c3b9c636927e868259e64ee02f2f9a5ba0b9f1c4b2a9e7cb48beb319433419798210d720f6879e4cefe84130bcaf22c1e270f3e7262a578ced12348bfacc7ee33573d2916ea63ae14659f467dd8e5f72115537fecc1406e977438fa47375d11d5327cf409aa1ec22b0d4905084e18135917ce073aa8bdbf4d9057bb2e7ae21cd46342745b6c1a43631a5a25baf33e59e461339e402f29d787463c8d5ac2a889e7d740b7baaa588024c683aef08e721ae1f880966e35e8288b4724d97f6feaa0d812a9e876d10c7c8c222742ed14764b183b66100f3644c98ee165abe1f36a2395279ac1cba57258cc5a26aa5520a16d77f075214e439b6eecf9791cf735066b66cf71442b377775018c9ab44312fb5a40c4833d198a2cfede24b5f8bf7e4231c62c5f33669a2ae631b3a116af83acc02b72e05819f01a5e1f0492b5b11ee1f3a73d8bd473bef885cf88b2e8e35189bbc8ae8c261521a0000cd0bebee7295e8d35df1cd49f078e68993fd10373a53eba652a3f4be4016b27961e93935a059a321c20970e694c4678813216632a684de2ba44885592672cf46e54c9ff27d01b29676ec1c058628ac1e7cb063885c6f6e428195a37698c7f1941c3066480ef3d4c8e1b601b6b65c61b21c10bb3d84d09f7e1eeb38b7c94d1fc658c57106b39cfcad009e4e4b93c6d969b0b7ee231234cc1383e71623de0c1930db8a8dbf266df0e2d924da51d9f49e836b82d2ce0bb30f50bffad57cb960f448965a23a6057140f7da0b5e29caa6f95025027be799a52fcc906cfd6f55cc96e712e11ba2bdfefd3ef150f1f04f6d8de5d7f5f9f9262ffd4c0509078cfeffc27d9bacdcbd99cfea305c080c296d6699654e909a3f8b05ec63ed6bf1c01f9b1b1ebcd5c3d34f8d5e8a5d3386626297e31f510a7dbf67751afc4f77effede7186e0ac5a05c4cc7bbaa0ca610433f49bc9518f1ab48049c1dc8e7ab9ac646e024225326431294d5335d627c3a6e9e8a06d8fbda1720dfd868c071682118c570782845edb082de727983c8e4be4aa9196046dd5a92f7e3e9a3d993613c76af2ed052681ad82d8446aecfbd169b3a659d27f0b012c45b9fd2d5b022492fb34176720daa6af6b61d245cdd44a017fcb0d82b4bc34d8c14d8c815b75616a4b8a0825658e903767625b4514c8ecb6bca7e3cf28d065a4b18456ee149ee611f6a6ed9fc8060a06b0f0a6e3de41e7d4628e915808b939e901cd0e48c11deb612f94b1eb4d589df95e2b19077aaff56d57afa46add91f6274ca2117fdf4ec9ad15f2ce0eddcadaddeb39117da645bc127188f7596ca6c7ec46914c17968e3c2c976a4d71f7f8e853a558d6f09cd504e0475641389dc5811d424893cbc25778b3f9ffe28d83db243f69d7fde1fc646d6726b7ed9ba058a2a69b0a368da3d7da417d71552e231c3334b7b37884f84d831e2952e80b10b205eb9b5c02697e110e3cbaecf4e5af641335a6f8c4d00e8d2862717d2164e4ef64ca969d66b23cdf3bf06f801fef9553859094bbc872153589e8153a49c233294fdffd46656c1304642139fecd39fbb08abd4b8730169b9615d4809910dbf0a2ccb1fa8d0c38c950265c77fc4904f97c11c5e59b9f92bc653e67bbb8ec57e1cb7111dbba62ee56eaf48210af4f5f238490a4aec16c6c60fb4d968915a5a6fb7e6767111a6dca6e279498aa016965c58939dc65f55863d7c21b6885c6c360b46772571acdd7b3eebfbeea2a681e8e10e4ea4d95e259a48bb53059650c9914c768f1b9cdc3998558b5c3fb2bb4a643c85cf4ac4582d554fa71a40235700747589a8f837ee85a9c66d18bb3d010bd28f47505c45bf7d61822152e6acd38b3103115e3f4f4839d9ed1fdc3a9abbdb8885274ebeef30278964b4833509fe21a75875b7a1e59aa1f293c9ebb12e2f8f2f112f99fa17c5eb3e7f4991416e2829f7fe1f851fc3fabfbb6c03ca56f72f11e5a21da6d3a6d9696e7de32137173b91c2f6891fe71089510ce634749312f9ac7124ad7b6757e4ff3d7594057e65742c447d56a91e718ce52eba5bd2d70c9fc35c463a9dc1c8591d8dd2092a7f6686bd784de00568fc57ace7ad9ae6805c37e8b751349b9b3ef1bc5cb2cd17d7a11f3ff522151311ed21e0b9c9c5ad9f1e4787e9cca1732f1666fc70b51e9764e66d1b9d30a1d88d75524d3fb53e5fb3a618b50200ed743ee6b165b147726120793dad8ab8b10e937e32de51ec7e3f2a3dbe047895ea4a6ae75739ec0e004cd0ee5fddea612d85a1ab88d7d2736c6e5272a40a3e47d013763d5a9b196a4c494ebb2ad4c6f72dee216b533bff8a61fb1a5dc95f39b4206ea2530a7844e77df2500fdbe7ef344d09898b7f3c5d8c79e3f9e9e99981c3df0e3dd7505696fde18c154f7e02d9bcfd47521d7381c93ba2cf41d78f561a3f53eccd577758e03fdf162e38e6b7ad8394b396bfd6aafce275591df4e8032d64784b7a731c408694c16a338d771eae93499d4051f8c668712f2c64fdd596bbb9a10a35766928428914a38b8a557856e13f97eda358b4489ff9ca5d523841f17f746948d5aee5698785e51492d8b8f6b6ec652b0c876ceffa2ed67efa633f66e21a5f435caa7a7dcea449d8e8a9bfbbbf8357cf2380a303ef8660522910a645ea39fe978baa4a3fcc588d283046b5267851f872aba05703ad893f89188b0714dbc4866be93dfb1d0d04e374ed83abfa660da4c6c609a3274e432b71475270e532f06da1210163895ef1d4a256adc7f300262158de51086124508d017712fc2eb1e2fd2d92222ad09b2f53009ab06d9bf5f3e71e7383297e63ca640e44389dbb99cf0f4845f71bcbd058bee28d4db1d80a328aba88bdd9a80b726bc51e53a92960a985e7b86ea2a8e88e6e3641180eee8cba7303d54eb60aa3860a0505a143ded66dc49565e0a80c0b31fb85f4966a2154c9d64eabf2dc8ef2a2014cee92a3ba64c27b3bffa528c9bf353195dca0e95329d8dc1d50b8d5f6cba99dfacd70180ba326bafc24a472a65a5929d7928b11443974187af4baf36da0e89ce5f08c5bd698fbfe81810bfd7762c0f5d975fe9c778e4f1166a5e3d8fe0de5a195e128bee49302ad6e1788ad555b9ad8ca4892d11df7867bb6edadc878894a0e199fb4bc05a34e04be99f27af0916cd68dd2fed1b2e9582cc30b8048e2f848d49d2955fd5ba97f0daef913749324112ce2864ba84998510a5281c1df35afedd4f98e3eb6c7b0c0a98b3477bc07e074614cc4d85fae7a151dab1a2ed42c43a38659b2fe859ddba5da7d4f2a8f63442bca4dd3e11b4b981071d764b8e02feed5b956eda0b872885ac801b678a54ee120e31429866ac759f6f373a0f1b95a3f1b42c1087371758e01278a69eff2eb0a2f1221629d020c7754b0ab0de3a0d6a0d2cb1e90f23fe08faff863bac1c837bf6696b734d066596022331c3d1cb3c3bb9be964e396a1e856553b6d968b73066aed50439d8e9a64a332d02a891c1d6e29a81e0bba8ef5a9f86683d83d72391b67b62d1780c77b6457a265da0b3599e0b7918e49208cb5cda359676c8d96191547ffa8cc717cc7b6a6f449349e1cc4beccfe7613f0d3b715e4882a69ef9173ac2c261cb62291602d61bf53ad9652186dbde45ffb908d1316e4ed3c1d0b21e95ea66745ca0f5d480f690d2c519b595ce82e967644cf7b72c9cdf158da5a7e8443a6c7b60c129f2063cfa9b9f8989065880eec8dacf623e93db8e99c09cd5d94df9ef277ea6471ac2911a3c86a92831fbcd52e3b3af31ff8445f043bc48bedb11069ca2b250ea31fdd4228cf2f7735b6012dd9027594afd09f0b5a38c1675fa7f6035d3b5669fc3375cdf438e635b62e7b4ddd003c8e366671bc8e9ef38d448a48e52feb48510daab05d38fa18c7d8c0b3a5e8420f933737a145de6130c74925bdcb3e305a07202f91385af1dc4808d026d33e6dc360391b8358dde02b04e6935c783280eb340fdfd4d015d2e525dd18cda917730df9d19b7eb51ec0f53b3aecdf46ee9f68fbfe0c71896553fc8e85115080ce5ae3937d69820757d54b4ea04476815a5321ecfa8667b5ad5059a4b5c9e4e0968a38900c7faf1d52b895c8420f1ec7fb4839fef81dc2825e602ce89f3c06902b61fc0aeba09483dadc596819019c54d2d1c52ef98bd2f7e6c3053daa2cc69529515d9cec00aa1a6aad3c4f093857fa82cfd78bb540772400277753a1196bd4005a91a3650f65460b3a9a36d6c53551053b95e24d1ec4d078cdce647198ca0463cd7cc0501369399fca08aa9df985e11bcafeb40899d419a851af6398eb3c15ce33a3d90055706c1da634e3120aa28de3eebb9bcb14e7dc2e11834b12347dc58b2292aa14513bb993b78f8121cfbd1778e1ee331461a556887a63c6a67d3265080f3bbf156f186a26bb800c35ac68c0a472eab420aa380146dc9076bc00c65e75e4dba58475e8b2c77b74f292db225fde4f6d2a959f162855519f07b77677a56c7e0e91c7154c9d20e400eca9e868e8cdc17027ee04164bd29678d7b8e6319730f060ca1b246489803918f62f9b7d759add3f3f4dad0a6ef1de4f4077945db34a570cdec7f7958103e0f73ff1ee8c466ea692d1dfaedf7e7a7e94484e1ca6204d044f468f4527844f765cf4eab0a33a680d770ad3507002e35ac84f6687ca59e4fcc3bb51955b2d4d98068d5d44a46ed5ef40704d3fb7d10154f4aebeb5d6a305de2cb6b2711c5770bf878f39f35779620b1d695c2904da2f6a595852630497caae4cc9a822c4751b51cb69d635e6ec47d6972a29c59515e2eaee01a5589c03bc24916b76c32ed9b78950e910211e331b033c052413e24ae325af29db647dd02ca06cc5224a8ddd55f26ac43a83d96e0beae9d7b9ffa31d515340cce114c66a177f8d7c291bdd49c1490e880d8f82ce4ea6f7651404d81367362f2a3e9b0ce311eaa8fb8525cf8690a8f943ce49bef0aa03caa44fcb439b8b7a31a72fbb61208a04697ca3bbf8b5a0606341a0e784d6cb82b093b274ebb4cede80485b612e321be1166e3c84f2bb1789b343863ebaf12ca70a92ac55a78c7998764400fcc9812fc3e8737af721a4d5cc5264f3a291f25e2b52abe5e07a38ed0932614e87fc1bee6b2a8b66b83fbaacf3f1b49270f8c78c5468ed6a7e4d2571d60cb9808c8df22161e553f1fc3361b0d4227e26d087c80693ae4c4477afa54cc53c3b15e1b3f4e137f9366aa52ae0ba3e5f2d50c84d243d55326218faf8ffc2d6e5202bd20e4823f1b4574181a7470dfd658471b2655b40395dc6359ae87a53f19edb007b977cff3c4b0dd1b2b23d4f4b5103cba48612cc2a8d1dcd208f85c903caeba0e6d3a7348a6129c86843df4bd2b5a50699955e9c1d6c6200dc5bb2d90df887813da1b9acc7678755e24da71ba4f60720b57ac93e7f8ca9e4c9c0be6a608008e5f5ebcb631542c9c2f6c408279633b43dd688ccb4679ea0e0d60267f194210ac7d7ff258f76525bb51e2ef7d72bb10161a72083e7de7ec3ce96f53ba4f83eed496525ee2ec23ba0e06713cb094637f2863d945432ccd307ef45e62b25266282b5227cbe0c9b27e2eb55c7c15510ecd3145c01ba5dfa6b57ba234d1548cd65e851953e0fe25805acbe0be413d12526dbf031d07f8e1177d3377a2575fee0dbf74eb62d01187af05ab977b1014a5f52a5a6f20de227f3a537eff328edc4a170dde3649d6778aae839e1e24793b44b4251518f4f39a2d87add841b3eadfca7f57d968e27587bcdf516b425e59866f31c19c2ff71c575fe262536499d92873266e559d4bd873147a449dfc72d80770e045c2d02bc3cf98270d5b66031cc3a8020e688c629886cd664a2e9e01491262a51d5472440257dff2e991101178abdfa061850683747fba1575df27f75a96a4d8aa64da924bb79ebe2e1e23ecefb00e88157f648c9ae937a5cba7d26dba81f9fcef54a4d550b6977656fd6be5226f77799b1b731f7f6f9ead317bb6a370075e4b5314829a0bcb4f67f35435df3a8303081a1d427409b01ba7b9824af827759643cc07c9ab6c20fdf9b94a54a3183d21b6f475f7b7cd8a515c1cef21b386368a39d855a92eabbf9e691ff24556ecaa9e551a8c415d89a0305c15cd8fa9838fca767318f14de9197e878c573bcc853a83107909311d62804fe87c3bfb056cfd43df4c09ea3a0d21f933bf722bfc924d1430ba51efba89d0c5e9450eb71f9e016ef8833d0a06e59829e66398b1114d39479f03d506394ca034388889b5333f1d0bc9fd8f09b7ec5cb4589aab56d96b2a2d16aaeb74d81a011ad5e54bb686c1a8df3a1447c7dc256cb670644010f68c1433c187b32920b9311ed70434f597258ee69a55ee5434c4c80623288f8cc9889498a5fc6653f4b823d6c3e6efe83d1bf4950ec13f9ffed06013b0721962ea59b8ca86cc06f05cdbdd0d2305d93abac05726b527177683bc28b149ffe1fafa89c009dcc0caf55e1d9bfcd1c4fe397d3c5fc0c6da383f4c41daa66263a471ffa9d981e47f85ed33653fdadce24b56b94fb30e567fc6184e01a8905a7aeb5925859118a1060295d50487ba0c1e76ca8f99e22f99a39b809b6505842261b0d4deaf7d83d2fb26bd39d2038bd1353a36ac970cadfdb87056420c78d63ea2b2a7b8289306c163ad35031750bb6adfaedbe1a7d51f5158cc4b04321c13926f56809b0335b6d88b5f779906cd0fcd5b7c0f0bf6d57490865b51ac8c9710997aa076ad1c40cc145e65c02d25485362c3f949763200c123e7cf1bd09cf556070bc874f0ab53e6988f439980de48974db3aa17f6137067fc13aaa24297473b2302d7b44265f473fe4455ee2f9d773feb52ca364a20df1ed7c6c78be155870a586e2132871ea4fad2b4add1d2c7040b46554c5b8586744dfde9612a76439e16bcaab8daf5cc20d89f880251a9fe6208c314095da7ac5ce369c57a576361cb1f66fe1da7513f997fd3c6e77b6d166592a749034ea50feefdc2f7a1bd4e6ec60fecdad23fcfcb829fcc8eaff523797d9dccc24145816b74161f3f6c47ab2b8632b0dbfaf01938edb025a9c9dbbe795dc542c24bd7135c7c5bf361c1c3bbf4a50497c9ef18ebab83833e4452a3df9657850d114a9d102ab023ae9cdb3db837d1b321a9bd69d9a278b97d1e086a2401c1ff69f5b228bf2b6cc7fd1e4aa6433c0bbd64a74a42591dc0ddf278cc12313d7d1b81c316018206e1f349b4ee5e3ad47562795c9478d29946e442c4494b6b6ae6415258f179cf340a9f99f9d16fab1a9f05726e37897d034d3f9b469daf9fe93e4c3994196a07c5f9128f04a17a8261a6e527629565c2890eb803722ec91e30c06ff14f407809e92f184c45440b20cac6f6be27fa691d140e8e584b623ba07dcd1ce6103c844f125671c253961ac00310fe5f4ab96bb88e7d7d7e1ecf63b5af80088110724d6a5ae7a4f6970cb920b3c055d82daf8e0b1ac53aa6679f5ac85959ab6264dcd6528d5a3f1a7c7fb9fc0e2ae9ed1e10a3331a450d6887fc51b0861b5f461369ae74099b381185fe076e2ea69b9eb54a699c9268fce1b3a07daf6b5dfcc4c02975307c9e725c3047e0fd1bca91f3133a5a14ba5cb001ed0523a95984b1a5c1a57bae0f3f556cf9c0ce59c2c4f892d0502ed46471a6745a5228adc2edf9f892b906b5c0e4e033feea3215e2b140993432d4c96c91e566cdea64a5a43648440d6cdce43c803ac6c3532d860473abb463d0737e6634aa9b20c78e73c3bbabb6cef59c8dd38fef882ca0c68866737731ac94fed1f8ffac930777301a35eed5c538ba913a1c63532c5fb6188b5c16ed280267439dca48f966c2a43b4ffc61261a17aee54da1afa7b5d2a92245beadff99989eb90a7c1acd3c6a066446987f64cbd6363bf750761e4d7c6c67f15118f782c7b9dff23b61bc124650ca02f0c8390dbe4ed73f994e1e5b45644838c0c6064624dc7761d3254dca99938bf376bb979921dfc19864a0fa2dbee6eb33800c50e4867e4ad14604e053b9a6339d5aabc5fdfcd160626a11e805572666d182eba3d983ae48df106572c7dec35eff7078d9ccd7e507c1e9a6ca2407231a0783bf13d201c4ddae4f9b77b4fb855f743aee3de013ba45d8a6420a476e52d38afb23c75f2f1bffc4f2ce861daa4ec733a757be06c5c63d086081020ded0e38a7ca7ffd27ba5cb21bc403666f301572e1763b2e60a7c0847244f540786740d26f0d1021a2b81ef853b2f07109f7094d4ae75f4e84cf1bd63ab94cb6a42c38b9825572036ab6961fc49dbb24094b2de3f3365613a04e557359ead16d4ab1e73be6dd71f37e88123c8b94c25c8b2bdeb89c517e413d9d09c6cba7aa3e573a1f5621948761455c665b713877db28d7c062ad721bca8b7b28ecc060b8ed68b461e9db67d4808e9e2446ff7a9f2e59161e6a0fc484afacee5843ceb45e6fcae60af3ddb9749f003d9889039039fcebab673512ecd739ff5b610a9a90029213e112cab2d83a709e19c7ab3ec16bb60b0a53f654f55ad2b734df700a100e5f2ccb0cca15802cffdfcc8076c8f22dbf9a8d42bc6e00b4548acc9bfff67c5d812ba4b35991d6c58fcdd60cd3f708e06ba59abe93bd44831cd6e403fe2d71b54ac7d813cfb4eb047bf799bc95f460fce9549b7a9a489f4ad105795689cfcdc9225ebe59299f6989b58a3e0065a9f646d82aa27fd954f015889562bdd4f897fe642be846cf3afbe2acd4e2e40e842ef4a44956b251a8bad504676ebbe99851701584f2f4f69aade1ffc639cfe3243729c938c15f26f8c8571b5ae94b02cd95b26715034390a1f1648cd35b1f0614baefcd2d7cf27530d6cf8e26f553ecdbebecbc1f6b0f2d3f152c5add956bae4422470d5522af30f13dbeed7580f2d3c9404cdbacd60bba697e85aee7e54ff7b4a6217cd29730c1ab867cf530de44478ab8c3e57c51866136b0497b89749c72c2fb8ae2b9cd77ad8c6d1af8878b66f64acf9df52b15d9bff07669794a751cf198cb5b52228d9e810321dde0381b9e294a60651e199db8bc0784ada92d86dbaf246584dc6c482ae93fe74cfed9d2e708f49de7513a07cb38724c7ae1cc3a2648c1c394fa85c56043060ca058bf7dd4dbe8c515a8057d7c56eed326905f25f00d091a9f6a2e5c528b670ed8d20a1338100dd2df256b7038ca7b92675138ae0283cb9840c9363a320d4ecca6e37bce9776ea21add8af8d470a33dea35c40e2fe88952bb3791de1677e7b9c32acb116e2282c2c78875c685ec1621da3bf69c3ffd3cccd9f0f0b08fe8f1d126f9db0440280a00dce41ed7a43ec3e6429f119ba69c536d6e384fc39715c54bd37d0de9232dc2cb4be2c437cd2b225d1e663e10e49c3de42bf6bde842fa49329adf64d81b1574c368a443aca940dfbe491a33b63db32b3190fe67dfb7fb86994eff1c294fbcc11ceb35ce80a600f80b8c79e60a88a9a38856535203daea2878362368f2e1441f5252878b016cd943828f2eb46da23adec24265b6af97693e065848af0157b3a6a6c65a04b0bcc8755eb1acfbec2792364ad0ad226d5c5a3e7f9ab49de80a49acf8aa5c7616bb4a67c26bcbf466eef8be47fc155ef610c790591cecdb2173295bec56ebf4fd91ef9fd499fdcb68f36e11e6c618b84692cd0ec332c32fa652d952e73c3e3dd35c55a9c05f9b049821cefafaf3a59d7680aa9ce02472e2fe5055125c9b9ba2a7b25d5f6906cf88628b994085604f93a3f72c71d81758c471ffe2e3aeb47a8c17fa5d75276d4fb1123b94098ab68066b45f387ffec1d1c79ce8d905705fa504c8d6811cdb28ff827c1848292ab86f43787157dd05764ec1482f6adcd99c3d54b85c1896083cc31b5c8026d377cf8a4ca5a18cd75f84ae7461a81045c0290558c20fa6956c4f58755dda891ac458a6c915a2076467e537eebe355505fcc2c973695d7dea386a52d2155de2dcf4747ee1374bfae34f1e26bc7f26036a53735013c670e5a97765f637723a0404931b578979b94f25de1d78b8bd6dbc8190112f05654fcc37a2e3af0cb2218c27af91d96b4dac8c15c7891b08e339780fd9cbb3fc54ee9521ec8039151ae5b447e7d818535cdf3f51fa49a9099af7774862866a17bd8cc15acd395773cde28240aef35970651d141b1b4dd950f79db94e41dc623161575815f52f34b2c009c622a8dc0f5e3841a36edfa29f450341137d0a61620dc62db96d6a54702d96b3c71782051a54cf1dd63fb6ffac8adc98f0f85c2d472018d4129e2458df225c357e4c77af6284500ccc6512dbf2368e1057a2a1bb6e95cf5e2421fe6f0b616ece11b16ee36e39ac2d9919423c7d59e77810173c6d6395a93592b4626886ff32925dfc8d6d252ca7b642a8f96bec5b034591c8a8dd5e5bef050e3250fca3698de501b4147c104889e5653931be758151adae8edd7c7a859048951f53eb462b6eb17b571b9324b9e45172bb5b1c93c6923255fba2305ca28cde0c57ec6da95269c836cd41e3cc9f24116267ca0ccff81d644843f10689364df823e60110d295da8a109b616f77464182f1e933abee28bfbe3e893bd059ee8983a0c28621dc1d734c04ab7e3c39650ed778a7afb22e811aae45b0cbd8f2be085e01ae9ae29d98ea42b353f053e1b3e62f0260fb4aaf91c94bedacb06c9814b67792cfc18fbf0c74004714de8146a771fee831a8819432a549765e3d98e0381c4a7595d38a2415dee9b38714ba48f3c1346c2e5a92f5a8a80ec390e78e5faf01ef784e7f9a89746988302cafe62ebc6bea14110f831a65c195a164741beda5d652b95a05b22573d231f7376b3b80335d3fa56e8e72c2dbc695f5252b01966864fc7228549da767b82d7752558f7ccdee1fd86cf25b09c0bf84e6286df14c5cfaedc4529f20863117eeab700bd3cbfdfffa778aed414080fc42a8bdef1901c6d770399857789d317faa24cad19459b7870e7acaa3d6eeab55af56976c683bf101caa052643c878fc505476e8e9e47a9cbe4a9de664d58c79c5c9b66a524c631975db9d4bab2706e97e207a4acaad781d453d39f7a13297459ca8fd3c5486210568907e32505764e8ae1315c2c38b82b8a2196ddb0ba106aadfe33e9c80d6fc404353b4e44bc6695535f505b2e850f3db9741e6aab44cffa74ab724f1a064f4a6db4f5ad8eec214dfd50f7a48b42faed430a590e582fd8af38c59dc0732f03a39130abf80bd7cb216224990b0290f837c605dea7c9ed496a879ca50756c22a92036789068b7ee0b4680d98b0e5a2a3e3087a6eb25e717d18f393ec21ccb7f3e4216999d30ca8589fc7306f11d49e2a2b7c43302697d17b789c3bfb8b1cdbf4517033b234913ce80685bcda0ee097f8a669054bbd016d0f6c307acc0cd308d59cbdf7f87e4aada45e74bfef42954633481911d034ea97cac9323a4799fa82d4714ea6c8afe0da1efa2e9d869e1aee36a5d67b2d0511f77de5d325ff0b42e06c2bd8551cc0cf5cac7c958f9a625ce53dbf76217b52e473d57d1c906e24aa8c34d192ee6fb88cef39afd66b847e6ea395eaddc45d12a1586eb769fbd21b955ce3a499ec868130c8a6f22abda5a5c86c7acf53fec0d1373feecfea2a35039b1dd5f875e715a28224a278ce96ee79c13593e2cba3025232e08e9214042ea99f9380e35587e160a00b41b70f1b0eb4dd71b07336f46079c25be95471de8b42a9f4fb03a1ac104d4ec1ac2c3acd51058d10ca9d3b7b5657d7dec74845d0447fa39bda1fe7dfeaf26daa8fae39fbcdf733ef7ce643572c5d5feefb350df7bd18c9235a41ecae829193e2f47b26408a7b8e9e844158ecaf50b395722a6a476a1bc1212d9b3430c09e802f0d3ef353abbcf29e0fe0358237e2049d1f93e660f5ded31e438b8e7393b68cc6880d4901044081464687079bb02607a4977416ce5d1823d1d9ebcf7562219a2bf767cdc7eaf0a159fd12431106a23e403812c4d948908132242e1c97fabbd69a565b58e922d13a728e92b04c877e05e6e4d877a9d0a3d094305d89495cae047517463b8cc04fff0adee7f44858a6acba6c5b763447b03a42c1918dfb70f54123c18920b0597363af65b66eee6962d91221d23565ea50462518a8e60fc5ff7964e11cd80d04bbb2412e29933c293db3ec78a04f38802ace93251af084677107f9b580f4890a1c6bd45e3225364a042ca09a6a6a5aa53d46f1e3b407fad951694d4c3742c43e10125e8699f48a8d133b8074995abb90e6c1d757aa773558d4a4aea451dafe0aa9b4c926efb29afea8d85959927d431b3809b69c2e65b59e30443c66cc6f864c6eafbd7ef32c8eb7a1dc6a663f5e02acc2249a3a98c91ca21a25544af94e246616c099a4aa12923ffc2ee23a3694098595e2b8a06cd236b39c4977c6e3a1e0a98b4120a0c360bb9127e332cf3dde68d99cb086b9b0ee25dc287e2d3f5420330516cac8a4e04449cb6076c795274f1c54b0ff8d554f38526b09eca3771606195c5c51c7c995548e91171002ea86bd4bca9c893691fae0f689feaf12201d31d0f2a1a3a9ae7e3b70d787bdc0c3a2a76c9b5713ccac9026491bf43b5323140ab2a0547d84ab83a48369baf87565bd8733c6fb9cad027f435f9ef0cbe3c402e5182fc8879b7216394b33b855f48ca8b1f1ac798bcdaa6dab95be3da780be57dff876a641e71f5da35da0490d0639b9c178c95fcb0e1602ee3f645367b2c684b90cae2d4722a1d54afab89642e008970d172d229c1fa4963635b5735e3c2c4ae30cc47a0a906c85f7b38a9335a24e87c2f74aa5c94902d4ddd087a9d5f65cc3fd5cc543545854a47a4d0a53ca653be46c4c0a5bec89c253344b000bc86379a86f2fabde29f2b56e08d6eb3278689e3611b97b22bbfee3d3242b7451af288f34c3ad642ed7352f182baede02a5deafa1844f1084bc4b5bd9ebac1e5766f7038c65868c970dcce1525c4ba4557cfc8647ec40f9043c4b7027350472693fb7371c7c212a368f1191f1cf1872aa3de694ebe05ae0a4f5ede7131856c643d7bec87cb58c02bc22d4df105cdd1810d4b9c07fb41f4cb824c03ac290c3a9d5a76492491616355679ad42bc98b06723ec035049726cc3ffc72072ff46ec39a9e829374b6545d5a2b5ccf34fec3f1755ca0e6e5b228e0674d8df64e3b8de4ba669490198692837079a8828cb0c2090ded5cdc360f67f21057826e4834901f4d306114805513678e4823b290a28beb8204ef99ca8e0d6429c7aa3e2d6dc5ea23ff89d325352fe7c3aa6f47f67d26cca3c51c383b62d27b009235af15ba039e84cc5755e61052f18ff2b16d2e7fab90e94cf30c36b68c2368727cdd247ada97ce1b5ca19e47f42a04c49c1636a68d74e5cdfb53a237d65d3dd421b24ba59ee8f6d47bb3e7bdf2472eefd148a9cff0422d8fdce5a87c43ff8c5b33ec890e619a190f147800cab6d1835ba2bfe2d932e9e595a87246346c5468f1f7db9bf08cb1158e2dac85ccd8ffe8189e30bf0487cdbd5d1fc1ffe34130b8b1a2191c0858d64f1e216a45fdd3e5591f787914cddb4557c88e6f5781d486fbd0c2dd7b68a9f3a9e05d2d29e7aef4f851d421a26d826fb69d1063815db49414296c7a930467649f5b875cac06134f9bcbc2d6bb9c88084a6ba106a6542bd03a786995d03f8c515cf66004b64f5f7bde8986aa02bdd84af0c9f6f9954e86f046950eb139b09f270be9f4b5fdc355a972f0e136144f1fef3be3d48dcf2929464b8bc255c4e814f000db912e999e59d37c272bd5adfa4f68b237bc851c2510b358d194adbd97f6ee38458de219fd1faffa0ab3dc0591aac11f61a3a9342c085d23b6c844eb3ce8c0dcdac17553eb1316d89ede3c84622224d63120f1a23cab58f5462386ddb407afc118398e304124df2358778987f85588356bf2a89874b9b4f83e326e36c9dbbc7d761fcb81ab62a72f0aa03107a5410dfbdc35b8c25e048c25ddcd79ad53ff6cc1b00c294b420c15627fb66d76f93fba4e560163f51766fa15d207b63ade8db5d216b17160b167c098cbc26f19837e15a6bf3ba37f93d5ecce0c14e2c7c780debfa99eba75add973226988bfac7abc0d4f0418469ba08cc4305c60672c97bf71e832de7d48b7cea61ac81e67de5e4971440342624fda46bf6b8af196827b9f85b0ddad4746b67c4ba2d7d4cbf1e7db99ef0a787646414d6a779a05643a821e6c7d22cdedf473e70050f4953d66df272f74676904ec5129fd5469762d8864a3a15819ea7c5a1716b628862e2a4c318d7b96384b75c0de290c035d3444bcd196a3f5ad1464eaa0e0c8a3190cd3d00f9c5cee18c86fed91624784685acbcf82fc86a928449460dc5b791da0e973f110c6e7230bd5b3ec98caafb6d4ae0bbc515664ec0251e66d8f210049797d280563418218f07e430ce2096600e2cb2c797230b403f21ee8e88d2c3b03ca7b3f272b0daf2ce1c2eb069768d92199b31fec315da1caf22e5a422410282772cb91f9a52f7148628889077b3f81d145b8721db54046fcebdf6d9c358c1578f120696e661f51d1d99a44448873e45f02fd7682faf0b7735c9867aa8673b06a91448f34e3f73f997337b47e4aa66248682d88f24daf2bfc0deec8d8a6dedf6b707da048eb899dabb34c4fe53de0fde66e2785d21c790ab1d1584bdfd96906a3ec1c269148a6943da1c537baca09b8adc5b6ec812888e232c76c29c0db0c1c18bbc93a81920c6509aff95fb46704b342b8eafe9581c43d61a65d135da188d4d942bfd0effa1db8e068cb6618f8bff6c0fe227619aaaae571601e749fcedaa100be7386a3c8b68694eaedccb2b9d2e0a6356a0f8bf1b7a2fdb3cc696321fb76a0c35e3f3784164ea184229a60deb76fb919e6860813203a9cd502bb542a216ebe2a9b458daf52df6591c6c5f16ec34b4a35f5c0b5edc4868fe788465f70bc7340ce661d43c178fb6aee2569d4e1f4152d1acc5a32879a6c28191828a8410d28959acd2e51a37619f3ec1c72e425a37065f49a1cccafd1f2b517c2f058133b0a36ff95b6d16274a7776df502bc3909e67bce5d1bd8ecd3d86dec0344c14448ced0428b06e309ff6b61ed1e128fae6728c921f3be87180fbdef2faa17014be6a9085452d7ab3133f51e41ed39d14972bcda0449751868f847a71166f6336df799fca7118e8b474e077d2ee6b73be947c9d3e53d662c915cfcff1f09d67268b0f2767ee0dec62708beb43be805c0b4511b97979176df458fb1a925ffbb05e4b7c58a20946a2ae788f8c4c1559011bdbed1cdb72b7cd8b3bc07f4c281a43ec59b2e169ea9fb9fe106257e8db9207c739374535f7731ff817fd6a97da5aa710192f4d4a88abcfc03ba764bc7e5b372ba36252ebaa2cfcdb05aed4e0b27401e1befc84ecdaa343a4a8185f6f0290ffe91d75b1b2518dd4550a4473e48499c5a92fb457ad30aa3943fb505c14649e7e1c73824a409b28b62cd7363d112292325edefd2f03c936d84995bd6a9d1654f69ff2305fddcef8421c6fa5e95e0804d21326f29090661e8b7d29acad4ed70088e0a02d9e0c20ef28bcf6c6e37f0ea5e8d101018274b1a9581cb0e4ffc249c6ff21507ec348c2b295e0a78295c70db6da3f61e3e060097394d4dd297c791ef4b56be9b01a29139fd0b69e035c332179ab95b905fa9206a6469c25f5b040e6d41fc75c41af2551b1e653bb4cdea718bf56be7aa323ffa7caea162d9737f25854562a0e86ff89bb5933016132a74321b229255a7722120b1cabcc76bdf4bab94b18a321414558f4363d700eaea6b036f292ab2ccc250a1acec76075af3157ad8e301d6c8a38a4cf5c3de2693876f0454db9353919500d13528f47452c4986d3fe2629a3449e8d878f64d29b34b275e4fe742363f99640c3fd23b3d389f23ffdb261c466726dbbcb3c34afa274b28901d1ad577fd38c81fb19bd7550062bb85d31b513614780a02b6b5e3b5b7887a79b97532d503b43d1c7c48c96829feacef3c031665551659f32875674e20f38721cdc1e641ce9fe4e9dfb9e42bf08fc28ed0b03ef218d0b0e127b5046a9b965d8287fc07d20d688150ca006c79be06c7fdc9bb7910613ff3b5ba73d67e8dd2657407b021cdbb78ea5106f1646e9fab0fe2816f78a750ded955e761ba85c819d46a9e2a5ff21cdfc247b7350b0f8ecb1b82b1f991dba6d8b1e63cc69d4a7da94a552e695c6ca72da158fdd2260128890e396f7aa3b62023deff2db64c9a39b6030e9b39d99e280a4fec1683e09bb3787305d649f7ebb7bec1c75b1a6ea0259b734c14a0a2558a99db4acabfd497d51adfa4a46fac0c29d21fc027f0488fb7a2952e576fc9efa0c6f3bbb9725ee8556fb5ab129aa3e3ce912b2df7fc3c15463f649844144f62493b9ca098c5bca1e14e2148aea9ef0b851400b32db71827c0b0b5f8347f36f3e78f2f165f8e3fdea653ba81865efca377df1273b6a1f5df53aada0cc162aa096083a8ff62f6bd1096861fb1aae2851b4e55feb071284c12c6993dba58a4e938ec33d897b5333d67da388a69569a5762165ac069b0f9c00cca0bd1139c96e8265c865c2f8e7c39063bc077f795749cb6076df4588e2b2d07853a1443fcab992c7be89857a004fa930864687868405f9d06cd44a0122e2df619de0c07ddb7bd136ef66b5a49f7c6251915d5361fbf75d8acc6471b2aec8c0d8499c78ea80511fe930ed6f8ff4406b5c061678c0e23dc998804dcd4c7fc166356e536d84a59bc35fd2c111c7aac8ac8c29f5310f40bf0161bc7950978b886f0ce03e2e053e0d426238e9401c126d362e59556ff6bbdd7886000b65fde3390be7c2e91df00f2e15bdf77fc84040f705fe1756c4402679479a18fea45b24ac145764d68c03b2ace1ad2a40c67b027b5a81c8e29ac5d69ea33c39e236c7f906f6a8445b7a88ddcedc5d7a5b3326e9192aaa4b13e12469a21b34c6709660dbbe4844ff9aab8c1af58a076ce7dbe92a63aeaa409de0aed0d76b0da0578f55c4d6cc5b77637710c3498c8cc4718da0efefb279511b4a026d613e50a3fa51401fc786f81708e619a9369b6d9d5daea06836850917d835304fa3d6dbb4dd72ac7e624587ec2437f466db42e2d5c8bb03eb389c0482c087b6c2ea1e81f13a0b3772e452c3d640583c9705267c10d4d5f88f8322d2df8a55ba2b2fd5c7cb1b905a0c2822bd46d86e73018d96953491224866bf73b315490b2cacc59a13c14ce68372fc66c6f76a3ad62c9cbf734bf90b44a0c04f2f7545d501c91ced47854b3a5d3773420c653558b73d3c59d7d3c1689db1782f2ef33fe06b7418229a34768351cf11f61eef9f3839d3e5530af4d089305a32ebd80c97223b67047148a36d8c3eca73f31f2d94c04d70e89173ee68501de0c945b74530795598204e145adc81502d83c2944ecc9a6c42db1d7cd91682e05051e93f714505d75c1553d85e4217ae2af8f40110cc1dc88a3b34653871ecc50420cedba771ff2502b58f3bf353d62b68c365f4c7a6603f3c2a238d3e98594f1ba6e1b08eada2918519a628a45ecae4b17fb39ec117fa16c9448fe1d21645120ba850e71e2947b54cf87c599a6a2827263640041367784ec51b9c37cdbb3627f76f21955d9876ea0283ed22b5a07cec34792d6f9dbb505184eec9ef7f35b8237fdaf2b05fad8d98ce61c635c10fb5d803f9096ed9c7205b421482557f2f7c6807df1f893568181371df13935446ce065beb87a55c2dea524b53c6d4fa06a7806e31ddd78bb4704c5764b66c793128a76b159d914f5d76543df761e1db72935277f57a7a7b2ab9e7fbee199d6b4638094cb89b66fbd8c82e179f53234e5abb6ec764690885115cedd1677f5c8b2887ad48de4af560fa3fdcf7350cc5e6b6b90a23541c6174d906278d63a7b850380c412984e8b16aceb3971f832e85ffeec27da4a05c46811bb9dc4f3693f6036a1fe551da2d57544f4c85708b06f137692d30fb2146cdfad11a65ecc4e0e1afa9f25ff22858b14efbec3557074fbbf067122a39370193dfeb1b41e38b24701506d64986a4cad8853a2a39028e29f46e08b4ea0a88d180c6762ff166212ce8280c6ae78665f9c70803a313030a3e69c41f93f246738e7d5f9862f9f1d126a5fa1d67b18c6a6480c8ee7f5f5b5d24740b6d55fb64acd9435b7d0b6e13abc83a76e075387f6b93296293815504948933d97c33edd95a62f0c28db4d179e49bafceec7973b5657285a7eb9420b22caad226aa8b055495eba5974a94b17f3c18928539f7f4b03e140aefb83f2d5c2b96f74bd2689ef465777f03672d0d744f2aa232e851e5da6dbbea3ab5948b65a60872de801be0665553d27f8b831cd1769bb4cd61140cec1c9bc6677091656eff149a9546ccd453beb00c4a1851f7a67921978c5ee2ca83cc84ad7c5687c556f227f97a6271f072cab034052b22046be0bfaebad6df055d007fc5d7b6cc63aacf4ec075a0e93fc4adf32819397db79d38193450e8fe88e8effb71030ce29e62d64497c1198f8190d3b8b25c8eae993fe86e3ec3519a7a56d533462bf20b7066894af483442d6145cd3702592f6ce789526904b9a916e1c26462338ce9dabbc4ced46be7db7203dbbb84a3bd575a5ce2a624141e7d57ee41481a24d9fce04a6597a376d843ec7f024393bfa4f043a3f0a0ee18c5c8d990cff3c9b6bd7caca182fdf365d03983d95c5bf21bd7cd1929e57817dcb8d82e932e9d4e293f7c7adbded7646c56728c99afde5bdd68e219a10fa986766ac55ba1f05e6e73f0ca5df6826258eb31d002bfd3e0500171cdc9f0dd4fcb9955a058f83b15444ec721c431b9dbf103c252bb34ff11e2eaf153ff5a061dc20f386297e36a7f3ca746aa3a135e479e0ba55cceedb69a7f7624fa975e048d763b3fc94aa7d96da972ddee7f91b7f00d6c1cfde389f4ab05c799aa106556611cd123a26ff6a23a4057a3b2ff2569dd14605968e76993965b7211c5b7405ff5c89cdcfb36283f7fa82ff1da9e26d0269fac8daf9015b93b3b536c5b00a2c7427e199d9807be9893b67f03a9a1970a1a046887e0a8dcf4e6a2cee57ff26b8a664f6c836b28b20082d0387e02d6d42adb8c5f126668c2292cda1123b85e39ffbd389d832138eaa1500b06f16b0d0e5505c970152194e30f8bc3a2ef01385533daec68f3246ef72956036ba3aead3d62e879dcacb7f505698c6687996ffeeefe7d2a0c3648968aec1e2b864a9b36b8f08211e8178883a27a079fe072f08ca49e5ef1ab910ff56ac7d4db6a0e25457c230cf920acad2698536ad3c6bbea096729e2687057b1d998103c0dde7df3d699a35e5b7a297dcae7d42dc5e6a138adada3247fd200f3060be71eaed95f6e17039650bd67ed21569598bba030ca1063affaef3ad2f17d74d33508a3c74b0a9a536a7c4109ffb9bd1e1ab3ea36555c2522f1cfad903c8a51e91cdff895146b56b83fff4680123b35a193c106e845f575c9b983e338793bddd57a0c46acd9298508e556d242d62cdb45e9c0f9bbdcce45a259ae0ffd57dfeaf85c64351e0cf392c4220a6d10c7e178ef8a88c4c1ad63c131cd92df268301730bcfc01f14882e51e9826b793fdfdf5f14ce7c44c59ed399e3a56ab3ede222dccd25736b85ffbf267efd69be2ad7e07a9b6360dcfee822e70f188722d0443239533c664b51d9d6bf46ccf8087116d5baf8dd6e0077800d84c309d7d749851f45d5f843cc369c00fadee5971af41f9451fdcb24138a1f19b9d3f166d6af9a4ac580b8b38c3ae8f0822640222d3563c611071c5ed0d370566ba597913dc6beed7470d7530b1b8ed213a3e6f37b15983e63f61de57cf0996250af0cb47c8c2cbe374678edd248d14f970fbe3c24a0a35a08b517af001b7fcf8cd9a01a4e909a1247600880a0db14025908498233325773bc70c907bffe93a537d60ef9590641987f23e28bf77550609aba6d5e1b13e79b1990ac9ab8b70e96ccf1c7d685606ea0194b40c68e3fcd64b3da521b770052221807de6c4186166a9d7efed120c978fcdb8380d5be361fcb52b5728831d367f29a8879a61d7eab88a95265b583c44068374cd3f26c23a1c62cf33b8f647c9891733ac9428d675510a6c9dfe5b0489c446a8601bd14bff6f637cb030b4dc60f8b17af638ac775a9339d7a4334cee79d830d735d3186adbc52e733f3fb410d20764d418f3863ed2acc874ca4be1aa47df5c24692638d703df3dfa0c7e7a1f3e9993b8f0e7607b4969532a97dcfd30531b19fc76c331b676881217067428c1403fce556557baeeb389b4146fa043d49680239df3182fa576d48c9d40492c78d029d149f1 + 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark{restore}if +%%EndResource +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 212.88 C +ski{/Helvetica fcd /Helvetica-ISO8859-1 fdf}if +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<44796e616d696320676174657761792d737769746368696e67206261736564206f6e20582e3530302064617461> 146.88 211.92 C +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<582e35303020656e74727920bb6c> 158.16 292.32 C +ski{/Helvetica-Oblique fcd /Helvetica-Oblique-ISO8859-1 fdf}if +/Helvetica-Oblique-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<3d44464e2c20633d4445ab> 270.00 292.32 C +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<3a> 382.32 292.32 C +<6c6162656c65645552493d20> 180.96 322.56 C +0.000 0.000 1.000 RGB +<687474703a2f2f616d6269782e6469726563746f72792e64666e2e64653a383838392f> 286.08 322.56 C +0.000 0.000 0.000 RGB +<20414d424958202867772d646529> 560.16 322.56 C +<6c6162656c65645552493d20> 180.96 350.16 C +0.000 0.000 1.000 RGB +<687474703a2f2f616d6269782e6469726563746f72792e64666e2e64653a383839302f> 286.08 350.16 C +0.000 0.000 0.000 RGB +<20414d424958202867772d656e29> 560.16 350.16 C +gr +%%PageTrailer +rs +%%BoundingBox: 18 18 555 759 +showpage +%%BeginSetup +%%BeginFeature: *PageRegion A4 + a4 +%%EndFeature +%%EndSetup +%%Page: 8 8 +%%BeginPageSetup +/#copies 1 def +sv +90 rotate +1.00 -1.00 sl +18.96 18.00 tl +%%EndPageSetup +%%BoundingBox: (atend) +gs +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.72 537.84 t 66.72 25.20 lo 66.72 25.20 lo 66.72 537.84 lo 66.72 537.84 lo eofill st gr +gs np 66.72 537.84 t 66.72 25.20 lo 68.64 25.20 lo 68.64 537.84 lo 66.72 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.122 0.122 0.122 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 68.64 537.84 t 68.64 25.20 lo 70.80 25.20 lo 70.80 537.84 lo 68.64 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.247 0.247 0.247 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 70.80 537.84 t 70.80 25.20 lo 72.96 25.20 lo 72.96 537.84 lo 70.80 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.373 0.373 0.373 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 72.96 537.84 t 72.96 25.20 lo 75.12 25.20 lo 75.12 537.84 lo 72.96 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.498 0.498 0.498 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 75.12 537.84 t 75.12 25.20 lo 77.28 25.20 lo 77.28 537.84 lo 75.12 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.624 0.624 0.624 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 77.28 537.84 t 77.28 25.20 lo 79.44 25.20 lo 79.44 537.84 lo 77.28 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.749 0.749 0.749 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 79.44 537.84 t 79.44 25.20 lo 81.60 25.20 lo 81.60 537.84 lo 79.44 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 98.88 lo 66.96 98.88 lo 66.96 98.88 lo eofill st gr +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 100.80 lo 66.96 100.80 lo 66.96 98.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.110 0.110 0.110 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 100.80 t 741.60 100.80 lo 741.60 102.72 lo 66.96 102.72 lo 66.96 100.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.220 0.220 0.220 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 102.72 t 741.60 102.72 lo 741.60 104.88 lo 66.96 104.88 lo 66.96 102.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.333 0.333 0.333 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 104.88 t 741.60 104.88 lo 741.60 106.80 lo 66.96 106.80 lo 66.96 104.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.443 0.443 0.443 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 106.80 t 741.60 106.80 lo 741.60 108.72 lo 66.96 108.72 lo 66.96 106.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.553 0.553 0.553 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 108.72 t 741.60 108.72 lo 741.60 110.88 lo 66.96 110.88 lo 66.96 108.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.667 0.667 0.667 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 110.88 t 741.60 110.88 lo 741.60 112.80 lo 66.96 112.80 lo 66.96 110.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.776 0.776 0.776 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 112.80 t 741.60 112.80 lo 741.60 114.96 lo 66.96 114.96 lo 66.96 112.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 494.64 lo 94.08 494.64 lo 94.08 494.64 lo eofill st gr +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 496.56 lo 94.08 496.56 lo 94.08 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 496.56 t 395.52 496.56 lo 395.52 498.72 lo 94.08 498.72 lo 94.08 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 498.72 t 395.52 498.72 lo 395.52 500.64 lo 94.08 500.64 lo 94.08 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 500.64 t 395.52 500.64 lo 395.52 502.80 lo 94.08 502.80 lo 94.08 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 502.80 t 395.52 502.80 lo 395.52 504.72 lo 94.08 504.72 lo 94.08 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 504.72 t 395.52 504.72 lo 395.52 506.88 lo 94.08 506.88 lo 94.08 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 506.88 t 395.52 506.88 lo 395.52 509.04 lo 94.08 509.04 lo 94.08 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 509.04 t 395.52 509.04 lo 395.52 510.96 lo 94.08 510.96 lo 94.08 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 510.96 t 395.52 510.96 lo 395.52 513.12 lo 94.08 513.12 lo 94.08 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 513.12 t 395.52 513.12 lo 395.52 515.04 lo 94.08 515.04 lo 94.08 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 130.08 497.04 t 130.08 513.12 lo 360.00 513.12 lo 360.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Times-Roman fcd /Times-Roman-ISO8859-1 fdf}if +/Times-Roman-ISO8859-1 ff [13.68 0 0 -13.68 0 0] mf sf +<4b757274205370616e6965722c205a44562c20556e69766572736974e4742054fc62696e67656e> 130.08 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 494.64 lo 411.60 494.64 lo 411.60 494.64 lo eofill st gr +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 496.56 lo 411.60 496.56 lo 411.60 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 496.56 t 571.92 496.56 lo 571.92 498.72 lo 411.60 498.72 lo 411.60 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 498.72 t 571.92 498.72 lo 571.92 500.64 lo 411.60 500.64 lo 411.60 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 500.64 t 571.92 500.64 lo 571.92 502.80 lo 411.60 502.80 lo 411.60 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 502.80 t 571.92 502.80 lo 571.92 504.72 lo 411.60 504.72 lo 411.60 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 504.72 t 571.92 504.72 lo 571.92 506.88 lo 411.60 506.88 lo 411.60 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 506.88 t 571.92 506.88 lo 571.92 509.04 lo 411.60 509.04 lo 411.60 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 509.04 t 571.92 509.04 lo 571.92 510.96 lo 411.60 510.96 lo 411.60 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 510.96 t 571.92 510.96 lo 571.92 513.12 lo 411.60 513.12 lo 411.60 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 513.12 t 571.92 513.12 lo 571.92 515.04 lo 411.60 515.04 lo 411.60 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 456.00 497.04 t 456.00 513.12 lo 528.00 513.12 lo 528.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<31382d30312d31393939> 456.00 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 494.64 lo 585.84 494.64 lo 585.84 494.64 lo eofill st gr +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 496.56 lo 585.84 496.56 lo 585.84 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 496.56 t 740.16 496.56 lo 740.16 498.72 lo 585.84 498.72 lo 585.84 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 498.72 t 740.16 498.72 lo 740.16 500.64 lo 585.84 500.64 lo 585.84 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 500.64 t 740.16 500.64 lo 740.16 502.80 lo 585.84 502.80 lo 585.84 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 502.80 t 740.16 502.80 lo 740.16 504.72 lo 585.84 504.72 lo 585.84 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 504.72 t 740.16 504.72 lo 740.16 506.88 lo 585.84 506.88 lo 585.84 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 506.88 t 740.16 506.88 lo 740.16 509.04 lo 585.84 509.04 lo 585.84 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 509.04 t 740.16 509.04 lo 740.16 510.96 lo 585.84 510.96 lo 585.84 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 510.96 t 740.16 510.96 lo 740.16 513.12 lo 585.84 513.12 lo 585.84 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 513.12 t 740.16 513.12 lo 740.16 515.04 lo 585.84 515.04 lo 585.84 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 659.52 497.04 t 659.52 513.12 lo 666.96 513.12 lo 666.96 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<38> 659.52 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 46.80 t 107.04 80.88 lo 741.84 80.88 lo 741.84 46.80 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica-BoldOblique fcd /Helvetica-BoldOblique-ISO8859-1 fdf}if +/Helvetica-BoldOblique-ISO8859-1 ff [28.08 0 0 -28.08 0 0] mf sf +<416476616e7461676573206f6620476174657761792d537769746368696e67> 191.52 73.92 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 175.20 t 107.04 418.32 lo 741.84 418.32 lo 741.84 175.20 lo +cp clip np +0.000 0.000 0.000 RGB +%%BeginResource: font StarBats +%!PS-AdobeFont-1.0: StarBats 001.000 %%CreationDate: 09.09.98 at 15:50 %%VMusage: 1024 36745 % Generated by Fontographer 4.1 % \(c\) Copyright 1998 Star Division GmbH % ADL: 917 200 0 %%EndComments FontDirectory/StarBats known{/StarBats findfont dup/UniqueID known{dup /UniqueID get 4092170 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 20 dict begin /FontInfo 16 dict dup begin /version (001.000) readonly def /FullName (StarBats) readonly def /FamilyName (StarBats) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -133 def /UnderlineThickness 20 def /Notice (\(c\) Copyright 1998 Star Division GmbH) readonly def /em 1000 def /ascent 917 def /descent 200 def end readonly def /FontName /StarBats def /Encoding 256 array dup 0/.notdef put dup 1/.notdef put dup 2/.notdef put dup 3/glyph140 put dup 4/glyph141 put dup 5/ch5 put dup 6/ch6 put dup 7/.notdef put dup 8/.notdef put dup 9/.notdef put dup 10/.notdef put dup 11/.notdef put dup 12/.notdef put dup 13/.notdef put dup 14/.notdef put dup 15/.notdef put dup 16/.notdef put dup 17/.notdef put dup 18/.notdef put dup 19/.notdef put dup 20/.notdef put dup 21/.notdef put dup 22/.notdef put dup 23/.notdef put dup 24/.notdef put dup 25/.notdef put dup 26/.notdef put dup 27/.notdef put dup 28/.notdef put dup 29/.notdef put dup 30/.notdef put dup 31/.notdef put dup 32/space put dup 33/exclam put dup 34/quotedbl put dup 35/numbersign put dup 36/dollar put dup 37/percent put dup 38/ampersand put dup 39/quotesingle put dup 40/parenleft put dup 41/parenright put dup 42/asterisk put dup 43/plus put dup 44/comma put dup 45/hyphen put dup 46/period put dup 47/slash put dup 48/zero put dup 49/one put dup 50/two put dup 51/three put dup 52/four put dup 53/five put dup 54/six put dup 55/seven put dup 56/eight put dup 57/nine put dup 58/colon put dup 59/semicolon put dup 60/less put dup 61/equal put dup 62/greater put dup 63/question put dup 64/at put dup 65/A put dup 66/B put dup 67/C put dup 68/D put dup 69/E put dup 70/F put dup 71/G put dup 72/H put dup 73/I put dup 74/J put dup 75/K put dup 76/L put dup 77/M put dup 78/N put dup 79/O put dup 80/P put dup 81/Q put dup 82/R put dup 83/S put dup 84/T put dup 85/U put dup 86/V put dup 87/W put dup 88/X put dup 89/Y put dup 90/Z put dup 91/bracketleft put dup 92/backslash put dup 93/bracketright put dup 94/asciicircum put dup 95/underscore put dup 96/grave put dup 97/a put dup 98/b put dup 99/c put dup 100/d put dup 101/e put dup 102/f put dup 103/g put dup 104/h put dup 105/i put dup 106/j put dup 107/k put dup 108/l put dup 109/m put dup 110/n put dup 111/o put dup 112/p put dup 113/q put dup 114/r put dup 115/s put dup 116/t put dup 117/u put dup 118/v put dup 119/w put dup 120/x put dup 121/y put dup 122/z put dup 123/braceleft put dup 124/bar put dup 125/braceright put dup 126/asciitilde put dup 127/.notdef put dup 128/Euro put dup 129/.notdef put dup 130/quotesinglbase put dup 131/florin put dup 132/quotedblbase put dup 133/ellipsis put dup 134/.notdef put dup 135/daggerdbl put dup 136/circumflex put dup 137/perthousand put dup 138/Scaron put dup 139/guilsinglleft put dup 140/OE put dup 141/.notdef put dup 142/.notdef put dup 143/.notdef put dup 144/.notdef put dup 145/quoteleft put dup 146/quoteright put dup 147/quotedblleft put dup 148/quotedblright put dup 149/bullet put dup 150/endash put dup 151/emdash put dup 152/.notdef put dup 153/trademark put dup 154/scaron put dup 155/guilsinglright put dup 156/oe put dup 157/.notdef put dup 158/.notdef put dup 159/.notdef put dup 160/.notdef put dup 161/exclamdown put dup 162/cent put dup 163/sterling put dup 164/currency put dup 165/yen put dup 166/brokenbar put dup 167/section put dup 168/dieresis put dup 169/copyright put dup 170/ordfeminine put dup 171/guillemotleft put dup 172/Tom put dup 173/Pete put dup 174/registered put dup 175/macron put dup 176/degree put dup 177/plusminus put dup 178/twosuperior put dup 179/threesuperior put dup 180/acute put dup 181/mu1 put dup 182/paragraph put dup 183/middot put dup 184/cedilla put dup 185/onesuperior put dup 186/ordmasculine put dup 187/guillemotright put dup 188/onequarter put dup 189/onehalf put dup 190/threequarters put dup 191/questiondown put dup 192/Agrave put dup 193/Aacute put dup 194/Acircumflex put dup 195/Atilde put dup 196/Adieresis put dup 197/Aring put dup 198/AE put dup 199/Ccedilla put dup 200/STARling put dup 201/Idee put dup 202/nbspace put dup 203/Edieresis put dup 204/Igrave put dup 205/Iacute put dup 206/Icircumflex put dup 207/Idieresis put dup 208/Eth put dup 209/Ntilde put dup 210/Ograve put dup 211/Oacute put dup 212/Ocircumflex put dup 213/Otilde put dup 214/Odieresis put dup 215/multiply put dup 216/Oslash put dup 217/Ugrave put dup 218/Uacute put dup 219/Ucircumflex put dup 220/Udieresis put dup 221/Yacute put dup 222/Thorn put dup 223/germandbls put dup 224/agrave put dup 225/aacute put dup 226/acircumflex put dup 227/atilde put dup 228/adieresis put dup 229/aring put dup 230/ae put dup 231/ccedilla put dup 232/egrave put dup 233/eacute put dup 234/ecircumflex put dup 235/edieresis put dup 236/igrave put dup 237/iacute put dup 238/icircumflex put dup 239/idieresis put dup 240/eth put dup 241/ntilde put dup 242/ograve put dup 243/oacute put dup 244/ocircumflex put dup 245/otilde put dup 246/odieresis put dup 247/divide put dup 248/oslash put dup 249/ugrave put dup 250/uacute put dup 251/ucircumflex put dup 252/udieresis put dup 253/yacute put dup 254/thorn put dup 255/uni20AC put readonly def /PaintType 0 def /FontType 1 def /StrokeWidth 0 def /FontMatrix[0.001 0 0 0.001 0 0]readonly def /UniqueID 4092170 def /FontBBox{-12 -210 1083 917}readonly def currentdict end currentfile eexec +d8061d93a824650eefe2785f13cd28a8a226cfb0a1a9915b91e00d2c2cb80ac548a1ab21bed4518a56748942842eff6121b01bc269e7837046266cb27dafd3a4fd0344e68245aa98a5f1b5bc9db554ebffb879f1c082989cf6c044b76f4814df51dcd03f9e3397f3c73d94f85771983bd52fbe6ecbcd9a2cbb7b3636cfb819daa5469925fc89a188732d68c6d06c906d183cb4bd495aed0c41fe6b7333ad90a1674478062c8996476573a0cdad62593c86e4741ecab7b8c75a6bf02971dfdc2c5a2e1c8f74ab1e91315c54e72426da3a62dede611d5967201fe8bfaa5a21c612c0b245fa35c6706b7b9aa3f73ce16604e3109770d367fb30fa663aa8d2b246de733d27174a0b818d54c58c3676435d43949eb9e5e335396296bc3f096fc154616c0b723b0b4a100ed45072f371f77f26e02f1dcc41376638097d79af0a4ddbfc37dd6cb60d0d34ea5a7536c655d95549b8a5a269e7e927c3d89f74b88e17973c2e8d64688089d329abe6b1009c0334d57a6dc34f22efdd933023231fa03fc81093ef255a199448f17d8f67dbc57c38b2fa163b8cef97a6f42e74af55319eb81a6fb9de18810ba9e3659a7144b80aa066a9f386de3030fc4985efffd13c0cab7049a09a71dc1dfa21a1540f4289b13dde08c0d3b4a01fd2bcb4e256b398c94036935bc270713a24c51042bac575ed4827e17e5dc2997753fcee0ecaaca582c85518edc0c3dee2851fa4d2581f7b399f07013ca3d1d4702cc27be134cfa8aa1cbfecac76f1b406b5b3126c3b7b60ec34340aac6433997656b3dcc1af6c8036f051edfc109a493243546721683fe5c0e48790848079c74ea0640c3f9c92cdd22fab8af9b5575a5d1d2cea0f1f715505cb02a1e200cbe4ea5563d0475cb13bda929286f9c11eab10ddd676314996954ae3c94bd14f364d5202e6ddd20b1b4c7abec1c061b2d8a1776577387a2f2dc424f56d44e58b96f91f7b871627089498d76bbc6664e1ebc9b26486cb727d4a5d62fe405324ceb0a5dbf51c9619f2913e4dcea44c5bac49d74bd049f28b83955e13f0fc77d998a307b0bb560757b21e4a982b59cd5723d66952b8a7ad0311ee6874842f454046538c475b86983b4b8d9c00e814009235a058f6d5fca9e8339555518ba2b64ee925cf0944deff5c14069a1ee1de2cadafaa6421f495c21c042690b3a7c9e6a5a137ee005240308e63e0b1d4bead90ec607d19c57ecc24c2ea9b8ed4af8e5ec19575ba230c19156ff9b23915a7b50666ec4b655a2946f97c5013cdfc31825f2c1040fb28bb8876b1accb1fc005010e5e5d061651dc9df17b7bb37c495a37df9659962680951290f3f4168dffb294f83b2a3c423526a97451e2504fc0c819f4d263834ef7c8588ea4d68c98eb5e3ee3c2de20a6da219b3256400a7c745059581d33158a505d5bb07c75bda324c2d8fe34eadb98520c7b82838835e92ddd1d89516478cb1ca795324f802e1f7a5547f671588fc3e5b909f5ab9d573bb0766569a36e89586b7410b76867cad6577022e9be567d1a5578361d83b817fb994758c679fcfd6b22c9fa7c6c76f2a72be566e42167247c831f826d9a10e03874b9747783adece88750be1206a07923cd9fe06b677b61c69a7dd9e0f9dc60771ac529f6adaeee9ee6652cdeca5789c7f242266d86f0154a1984402c720adbc3dc79b6eece6d378555d78873844ba1cf057f385e70474132e0bdfabe169a631e07d12fd21f18736013499081e58d72e9cd451df304a5bf52c1f1723a5ec8b7992d8fa3f33d5be97d4c114fd435a94607f8be09812bc1fa4db028644e2fcef5d86ffb947a14993a93185b054a7cd9ad734c62f2d9ce3c0f9e2e8678bae5b92315f60169aa85d4ae22488cfab72b841374ac3f39966b9e126ad64c0307b54085b6e25d51caef51fecae4c5ddbfb5c29b15cc90ec0795123a84d3c31173b49096d617707d9e192da82493ac9884759115c02ba4686ed464d523aad69167e24e5303ac3eb3da0eebcc420fdc256cc26d466f979c8e637344958f02ba9d3a481693fbf13283d7d276af546abf2f2bb4e6c6f835c97e532bd5b40e8b08eea4441e8a9e03021add36c4fe28180ea466082e4fd7facb03f7abd47c929c4e0d84132835e59f8276ac7fddec7755cba924dd1c97e02691f13f2e159b1e358ef2ba347e2298b0b39f5ffdab57daae22d94ba5064abf716c866b64add8e3981b76a77a3a8be0a462594b9e1257e7940b237875e000c0e23a0841a85da6eb5af931dc0ddfe912285d160f12a66ebc8717fd37c13d20cc132218d31680d596ffbbb2f2805fd931c61693bcbe365f0d19c8fea4ff3eceefe09c5e29b7fde3782b8adf4bb1aa7f89ce01fa59d1322a1ccc4d92705e274bdc287312b23ab830968143efe12c8d4ac45e0c72c11f630eb5ae0c835b7f7d32cf261c20f04b7df8e362cb15cf38c531a3988afc8eb957fcee0364049ccc8d8a6935200970293486bb69db1969a2aeb39829cc4bed803e0c266c77b0dffd349ff9ae8f95558a3977775b1bc2dba5be54800a9e9645155315b062d0b5a0491cf90a66e84b581070f30d5796f71e88db0352432e8df588d25c9c9b2dd12b976618551d5625e357737966d9a15fe3cd9d54bc275b6f5993ecfcfbb373c419e2f8ed32fcd56d30db1345987a445ad259e03053244a1ff80c9343538c74845a907b0480f013289cf475df6c989a81aa5ba904a63db328292553fd4fc3a783fb76ee6ae50be4809ea0aaac9a9ba429c9990eb45affca8587972c54fdd677cd14f81404c77e4358212f44826316a927983c968767e7be1c7a36f308b6cab1648780b4f1a568cbb0ea49f6a6352d6ab18d54d442c176037ad16e18a17d88cd8fda7e86895c89368239f0f75f8c26f850316a328c40efcf316d8829ddb0fb69b250e41b94144e0475acadf63e51f27f6ecb6af4ed78ddce68c055b7a1f78ec1174bf9d67f54838da11655980a909ae1b80a2e6282137c75e49d703e6d5b4be616e62b020a8d08efd14912337a75857920f1d3515ab2771d38d8d8f610c9801d0b0c8d3388c75d211ac4e4c0c491d3b70e1bf1b926a6fabf60487613e76e6f779c4aed60929561ed06c676de7d5052f60db62e446ca4e2775b966f74a2ab55466ecac93c65e48d5e6b88080f24534ca63dd1e6781920be3010f3e9ceb771c5509754ebf963de75b4b9c9116ba7f4e21d9d89d2df167d8c5674b2fa61f49f016b4269e602c6e144de4a382fb7f185dcd82942081d6362f335695587d2ed1071a70bb27d51200a1de03763bec6b2c7a86d8f200505c07f25fc6be9c044110607154cb69efcbfce495dc86dc634e20349712d3754ce99a8b33cc59ce272e39f481b729c878399e51976652b4a525d107ebbd809909ec95f07f2012672601eb9ada5e0b3292d68b6ff8d529a2dcd23f7150d77ba5b1a36701d5954d37ee96501f9efa8e037290f6dca8c024ec0a2ced95b8dcbfea0ddc55dac8ffa55e224d33fdae74502f8f0085fdb5d6d031d34a609db4ed63ceeb285f3697049800bd560e31bfdc6862a49da0ff4b4e84bac9f184e08181c7870058559f826977e851f7dde09163b8b3cc82be8103f7baea3072202ffce888f1bbe37cadb748e2a3b3b53cf38b4336a4eadd0afffd76389b1dd9d067888c4e647b07a7643b81fc08a15872f08f6295eb45e7838021253432f2bdfca6c2a85aa70efea06863d3ebfdc555f41abceb6fc1a5f92448e917ae97706dc04adf0b7bc817c1b93d2f924b118fac5fe6053093401a4676c6d7ce7b4ceae1f5c149b1d8d712d32d56bc8430c210a7124e192e387ed9696df38ac2763e3a065c3ae4726afe9c16b07891bf5243c16add2bf494f9ae8b7566d4ee600a7fcc945d4bdd305daf4df51b1c0222e5594c65af003b51549e0e790ef194943d4accef39419ba173d05788ff822d4e3d4fb5a612fb13292aa377e50a44a6953bb793d0c521c2179012a882b74ece2f79723fb75624ae9c446ba358a3effd738ccb59a856f1bb5afe8635e1033936d58da18ea1f7464758e4647ac03552bcd1be22ef9d4c0f4aea0d7d1c91234ac50d5192bda73b0e63a8303ee284009e6f42c0a8671cbac1c02ac67f096cdb67e83a8d3a8b0e2915fe4e498d50a80892a374cf637cbdc145c2a4a16e0449fd300f7f03b9c80b320addb404d3b7388e5473a6502c74a9d614b21f2526b2e4f9fd9c5adca0f01677b57de5a55d60d9c428c6833d7abb14514926e09bba6b07763aad75d0a934b7c44976be43c289fb238aeff7556183515a5c4b085447922adff5498d29e101a60ff02e893ce8fb8d446874914eb3d3009db46a579d14dfe884d22d9ca5bfde436f4bf334c8c8e73cad66d26b9b711b3a2a3ea84d6864945e529bf59d397ed0acca03a3bb32e470c46cd6639cdae83b4e8e6decd2e8574e1b9361e2600bdccd6c9231ddb2b5981f4148984e0d21d2bc7c54fa7b32144192d32a60bb17520e855b14ea6ba31068d4e209a5add8dd6cec44932063adac2280f985cc70099a1fffb3cdc3134604bb8e50ede70ce9db412a309a21a0541662050f545cf6f2fbb39e9106e83d34dd1a7f9f08b66e68052482a68778687aac8b793ca24cf3d258d7991c4d2c0eb760d1b83dec08277bce87bef9883ff7af63a927a509eb44ffdf2f8f2a529baee6c68478a1f8a10c81fc3fe0a88004843f05d15b34d04149508d7b29ff2b11ad5e150269dd78545f0f57ca1752f6197a8539ab3aef587645b5dda3dbf18060d30c3426f2fff04d9bf22f1591762597d72cd6225f01377293696235f084801440fb9590bf6468e73c11d7de5c7c9899d6a84a9bbe18c8238e117ae4e74ce9c087957935630399f186f4712caa2775ee026f1c9f334bfa2ea897f2cef8f6d2f200bb2fd7d9292c056149cb3091d54be657c5efb690dd7290b7f866330d8b64cdb134019ba3c608bebca348fac2ee3891d54ce18d427de0e8270ca0b19b5cb9ab69ff7bfce6b5c6431fc794f1a2ae04975dfca6d865e38a85d0092b339119f43ee8f11f999ff0132145ef65f2786d9dae9c45dff0ff2195bfc604db64e4da4b681dcb6a3e2be4f691bad02abb6347e7ffb00172df452182679d10029a878d14569825c6df61c229e158f92a6a0e0590722313729ecc3c93a9de9f044e62d3abdf500ea46557e90649aeb8cc582bfb6fa71042b330800d50aebe27e1b7605c3aca1f67c4116d93a1d59d7f9a9d7dacb2c949193b0e901291474ed0f6b746c680b337ccc6adcccddfee2ba9e31f588940931c6d697222b14220ece34f97d640f78eafe33d689d8c5e94ba3eaccb197728d58924f1325c5951246898b2477057915ce4caea524151e7f3cb049441ae88014b89fe7730eed66c4161b2e01d608d977d674edd37527433214b40081ec8a262da3f69f07dd54acc3a8dc5058a927bf7ac5d3ff18e0e526cda9eeacc331cfecac11d2bec5872fdd5cff5f7459a42f263304294b139fd7106149b962873b757a2db3ee8e030a8ea3af3366fa5f3226d9f9de3c48dcc0f701ac74385d2b753e655804a834456e17ee576872bb5e9815bd6ab6a4555ce5fdcfd0b1637357424813dfa6443a46200dbcd46f7a15d342c14e5b99c1e53953283d83e81311eb2537162005d2bc0f18b336e33f7190d4cc4ab8a86f596ac2522b6fe3aec0befaf024e35f811a309c8a03734e432ac4695d977d6fc14c93773edfe0eab4b5a0a6d55b4ccd205086b92107a434b119d15f145d0f3511f823e69a4b3777b659555f06116cd99075982c200e36eff85d7931c7b918af5504bb4129cf65c8a33964b3b6fd3b2340fd3737c73f7667632cbf81535b88096e99a5e98ffee00409948eb2b46010a275ffdf345bc0e359ae4c2b6b804a36ec5018db1ddfd43ed28e0982be3dd61a41fc78221bfaf4eea3c94e8819e2d296a355bf61cc29ad69e2baa9caa77f4587be6bccfb178d553bb99bdf52716e6a8e2626505b819cc595f5173d13340fde8dbb4db3313a66348c8cf5fddfe7d7fd04becc8fec0ee1385ce5329088e772f1939fd59e2dce71c2946044fdcd131e06695ebfe5ae6e512640d0ea79492c20880391bffb1b3c9851cfba1b5b16d5860baa2a2b1f4e0a571aa3551cd73256e171c2590687e3596108defc56ca6cefb27095380b0bfff828d897c5f4a1f7710cc1fbe37ce9254c27edb772093e789a7e2a941d676fa8f14edf641dcb06fbd638e74a3764be77ccb7f93b5f961be59a6df0c5305b6ab3a20ead2d3eadd749fff40762a25833c9efbe377d2aae40b18e7785a77f9eb4f05f987ac7572854859f5fc5f56240e94305543baf5df3fb905a1122d20d09d7133923783f4d1e30ce9bc990e1d4989280cdcae75b5a78ff48ec68254373f9a57663255c0d5a18bc78b3cf2002befdf0cbb3cb5e76243b963e16ef7a34a06016dbd728117ed141ce213dae5acc96930ef9320938084dec3f77ee4e595b496648896de03deef6fcf49f6477a04a0b190fa668ecb8dec555db55d7ba7d0151042dd4f205e50f53ca706d93c9ae1b67b51989ad1b3ebb27f2416588397429d2129bfe0d5fbc7888fe0ca49754024224ba6fbd089214122d5c5dfacf7fe314c34581b80fe2f0786f7a70788a1dc27bce9f69daf04f197e9fe3f735a339f6f88067636e23559d1a02cd1d8b70fb07146532a5b404a4491d8650a22ed0f49088e86054e76656f079074ae121f5039c5a128109551c3ad7bfb874de16f639a82f0cae1ba1e26cb21bb8ab0ffd0fdda61da950d00e9a9d319c32757cceb80c07716cecf71f96dc167d760bcb54c8c41387d7fb8b5f884a0f7f53acced99690e1316a8f2005edcce538b3b511a637736a08c932fe9f54e281535c9ebe5716228cef9648813df7f0ce70b5107833eb4025e11f93aa574ca8215ce3dc6a5069f03f22a2224d9d2f8c819714b3b02f32066785f9aaf616afa69a3c031f1d1ece51d541f60d6b8e739b63b0f6472b93e5e34cbca3474b47deec1d72ddf91baaafa42078c177469e8099ef4a80758225c7839a0ba643dc3c88fb01ca0f278f077675f0f3bf3319931f129dbd9ef04dd0daa8cf8bc6573b6b2091b64326a366df67a739f27f8c20f47ea3bea9a9880b0aa3b558c56f6596b0f51b124b78b717336142cc03823f2d75c0ad84c09868cbd0dcfae4ccf37b345a26d5e08b20c36505447042ee2ce81f450a835d7e0b679c0c9eae37ef6982001a8c52708c5db0ec2294a90b9876eb789ab09af859a0a879cc27d2f52dde9e9a6960fca2530244cc26d3a21cb294458d707dbe2441460d79d1783fb334a3d144339bdd635b676a1b260f5969bf089d59a526f56bdcf92bbb2d52cb268ccca6c66e4ceefa57c72cbdf8a4e1a2b57ff356f8fa49db680fdbaa3d4df9f1d6201307a44a9ebef9ab8c893518d71beceba645d6df155f6aa68163f8d66b40c1084b673ac16b287f763d40db303c4c9f9e76a3e8fff77d595e97f7e59e56b02aa8f005d0c6830931892207e25a11520efbce320b99362de47e093fdd48318cef9458ab6b4093d1480ab1424e82695527412d0c5e3c299eac02b67ee503a9d04d31431d172f50666fa59e778dc43ffb7eb3f78324a5cd88601f7109bf3bc03f0256ec90473715c9a626a8488a4ac0403438c7fb97438334506f3718c262c6fb671cc1501e1616281c50c1f1abb0e796b5a989d9419e9146784619689562ee006255b58c5030d4deb7bd4e723d5dddced22c58905adb6a1b319ff10a8610912023c965c87e8b9f50babf746950ca2b356c1a9cc1cb8180a3536b2a639a147f65a8178fbe711c5fffb8fba62069c74e02ee7bb219bde7f581ed080e33ada55e37013823fbe5eaf8f7b774209a75b047e7626b8b82733f525e57792ca6c79bd882c5bfa323fc5ed98227c892ff958a359fcf654cb8facb6827d717a899ab9b4d2093e7a3762ba0c9f7ad55124173a5bb29f9f8769484f698dc8f8b394816dd74eff3b1a7dbdf16096bd0ad1b5bd409d56783b6d418631be43d241d6b834e1e8107bd9e296f9aa43e90ef753d6ad527875f230f6b1d3914692840fd51e8048ef5ecc8e7d2da90645c8e0acbdb3803d677cb07714a5fbaf0caa48234e6abfd0cc1be8a80ea7e956ec40a54ce712c979d9d108c28566d3c71c93c25fd7c202c637aa06f1baa00ed6262f87062cbc03e7722983a7c87645ad8d6e0df84112139cd220b03e3b874dea9b9705efa254db06927ab7951eb72ea84b253e0bb877b77fb1810b078ba9f20280d7e85fd9d134ee7166cb1cd51525a5bde7cf96b26569af11b40dbf5b4b25a662c9e14dc084cc349bf451cc976d1de3ef735d001c18d7e6027fdba88d29016ba395ab7f6b1d232151acca1ee234a287c2d7843223db3df6e3e5325a9fc82d92b0baa4a28fc927a3c3d307f7a7ca1ec7a54e8b4a56c177aedb633425bc7676a10c0c2d51b5555f4757c2c9908cf39eee8f85913216c5df40fc6a04dc460e99f55844700b4e02ef7a81ddf4bfa798e5ea327d2c66db67c608afb6ea5753ade25c620d52a5ff2c1d43385737d41e7e6cc645b1f9dffacdc0e8cf72a9128abd66cfe77f2c273e7efb2c6d3ddf4848a023911b7287797cb7a3baff8df5f4d8baf2d30d8ef3daa330fe4728f2fc405bf82b6360d1c9f78d17fe13bad721756ec2bba578702ab8a41c094b22a2ea393e9d4d597e5d0c2f12ab5f21d4546ac61e0b96ad5bc47586bd42edd8caf964cd2b997e0bd816ffd593d5481a8ab543384f8090d7cc0d9d4dba9001992366bbd61949f2b33bb6633f45554e879ec6399f11a13be5d195c927f9e4fb503c2f7f1af69725add00166a3c6f0b72230416d09687ac6109eb06d16b8321ab293cc112cccae7bd8233a6206b814694eb0057b708a76f7c793115dbd09b6b6808cddd0dccbc2a20c5abd02a91f0846ac0856a5cf7be1319057e48631937a3bfff2d24f0fecb55e929c1c7d8dfddf2fb892926e20c9fe4a84bc1d9dfd203d438a7f989ba23836bd55b1089bcaadbbbf19e8cf001f75059a1dc3daace5ef08b0b55231f3b63ccbcb50805601c86e10e48f90dbae123b55d421df8301a9c67f4cdead045d1ace302b93f9337ada9ed3ea36369cf35577e868383d69cd425ece04e0cdc1940b296c35e1314d837d6fa900d661eed125ada136ae005179a03494e23a245d96e60cbd7a04f9503c227e835e58935e28bdba5446128f0db08dcd9b85049c5c67e357a3a511f37a71df23c25f971df40b9982b1b5ab845bd4870fbcdf4ea319afa2e225dcbe3b4b06b73429467ab402aeb48e3b661a0355cdeefdb754d43b66d1b576a1ec93994587b16fef1d493d53263ba10fae3dd01736b479e33dcf87dd9af58b353bc55b8a5382aff065773ca8e932d8e55a80537dc04193176a1c38082e3d4fbc38ffbac68bfcbd80ea1682b79961ca070d3f7938571303267b2be5afc70f196383a01fabd8952db19f7c5921fd66ef6f44523adb1bb09ed0cd03c14b8fa91b088ecc5152d6e288f2f388b5870733b489081581fcdc2e1483d3a2dd9b1bfabe1732b2ae37041d49727a2bde007820f328cc2118b610793e6a6996e1f336a061eef6b61120049fd0b9f0847409cb3a8ab404c563c1769de2660b073dcb30bb916f3679b5819958ce2f5330634e2361cff5c0915861ec791b0dedf34a845103f7e1041a366e6109b88bcdfea2e0d0d260f16717d67e20c9a0b624f15f1f05339a408dbc7fa3b8395895bf50691bbeaccbfe69bc22e136a37fb9d074d668eaaa2f98af8ee35119d46af0dd9939462cfd2ddeb85792ca7d38d61e2c5109d2c91fc8232503900396ae6a85b7a88c80136699e77c0d7408eb88538cc544a3db250e2bcccbfa8076d70b026d46cefa250c128f8ab95d1ed9f028d56b01489d81da013201747b80513f318b84fca9dd1c4d65f36a82d09d847d550e1854341338456714e0a93424e6146e34994f84cc6bee325ae41d716920dcc0bfec62368546c901a8d43bf94c9bd2cb56283888ca54b758135fbff776c9fa98d50271b172889414b7e948180c03700d2cf3ebf390f0f9c8985900a76be9171f7439c60e18a0db5a46983722ff1489f77d24f2112b9035e65cfd10fe4c560426e464b6759ae5f24116d16f9a3167eadd85389114535f44f8054d463c1b8bab08779d40b74ee854aa6d652aaf40c30d63622eda14aacdbc002c0891abcc764b676a3b049deaf49d6789c7f9cb12bb6f0d1619548bc12b6df69c98a4af5b085c76966b116d6a2cffe4a00733efe59a473985d5602319fab0f04dc3a55be53e9c87726d6ace09dd8343e3e111858a3ae45b35de08b1730fc628265f0afcd3924b9c143450128aaf68f41fd5bd4aedfaa9411bd33032a81405dc45005c62b682112ce0952e1926a47571a8790d639580797e33f991aa9c0b7178448591f044dc794e31acd413e6ec84b3ec0ac0df66e08e9a89727f91620f3f18f9238ada2abf4557d72553f01bebdf62bdf5742d25b47def93114918c643aa2bf8761441ba5e6699760f9370b5c29545606f6003e4c6e4725dbe4078b416022b20c1d2aa30d0dcbb724783777fcae6d2487bb793e9435218f93573064f47408d08a9c39bc44caa91c24177e8283e59cb9be2c46c5329b150478beed8c6e1e35bf56c3becbcadaef963bbc70128a1518c635420921fb37e2252910e270692e8bd641832740d67f2174ff3171ac73c23512bb0682a305899af28fce475f399ffcb310dd96cd469fbbb7629fbceccfc497fc2e469a14943fbd5c4d24c8c89b66f6638daa38cbf9dcb49dcf016d768acdf758356834503afa00b7f5c8116e147c5397c2aa8ec8a241bb2a5dcfd45627821a79dee1ad9b162796b53c59e3938c94a2a531b737b7d108b9f1f42a2164027e7d3922858aa7931dc0f7e0ec8e0fc30c27d4722a4d083115c916da5976680da42e3a7fdbcb8084abde4d1f95f62a2291847c4358cfe83b13b9ec2f1378f75f787b2b573a027b24e9eb8a47188be809666df8772e43672f910eeb1c23355987358a1bf34c3a88c2647a46eb85c1429e2e5123acfce3504e0ccf4b89e9b3de548e2bc16b8e765bb53568070a17b23aee93b0988b67e10dca6129f19083a22e950a6beaffbf958a232d2b40a7966f96d8d6c1d30d4e9d42ee28dbcf0bfde533a8b5c07c32c90c634bbb90471c53658d596fd066db06cf96e76f5563b2dbf17c284fb88a7e389b9340cb17c0707caee7791234d4b9cdc0406a59ad5aa3ebe06c7ac21851139171b188bbe7b43422e3847e30014dc2f4966126c2d23e1d54d0db34fb2f415347f14ccdb4f533d2f4ccfeae45f21b027cda966933daa5732464d7e125f32b05447fe1d15170654b53a5fc3ee1d2d8427096d1f71f2bfa3e240740c879ab752f0b14d1d17fd880f05d65ff64a05bc08f69d97fb63dd78346b9ca038d79764cabd013d57fb3506d4b0ccef1c92bbd704aaba9cb912e6034ec9ab77210531c9a1266c272ce3261dde19b9a574fe5a7a031416011100ef594396adaed9f884d18173f0fbf256e47d5c57a47864a3d592c2324c39bb6b9f8cd770e23e5884fbfc119eace855f4f21356a57f912c9e27fcd292534cf2ce0e0490aca08b4df6a3faa614239252279fd2c3df91e054129e1ba23fd9b7a90ed0cbc1f9f8790ebb11bec7b0b07a228054e1f8bb4241ab3a66bb6a224bafa455ebf835e5cc1b0f7701e2e64190091a577dd835afc77e72f3970721e1b6fd64ed65abe1b7376eb58e3273254b2da264df7a97286ac43f1c55f1b50710f54cf02da4023260084aa143dff539c5c7d5951767d0ca6b48d5ae8dcfd1727774ad1c5e7273c2aa5076c0a0fa3ff8f1bdd088fbfc17040808f3bbaa83a228b573694aa171d4fcdf13185e0a010788698eba537240a9ee729d7af975b4a8637901fa3aa401cee44a0940b4378ec67b101784d07fea844a50c542fe2a3e01bda791c2ba0ea9879bb298b7883e1b8ee13a88f9dd3b28813baed3f97c29bc8b9b2a0bdfd03df29f826498abe20f8bb7ef6be2930377c56430b7b0ffafa4193998c32fb12ab1ff63695a3201e227698fa8fcdb065c9c3a82d2f0b8a78ddc9afd5a1c5b135b019c22a46d8401559149293420d91aa98397741e9cf6bd30134bd8b5f3c5a1889e5cdb61aeb0f8a052417c5dcc3eda52fd90b2a8c2ade1a0cba31ccc88a78e1573f68ec6104fab6c417c631e90bb9ee10daba4cc047ce30b2eb735ec694521b7a87edf3e15fbacc941269090845894eacc56321d38ebd3bf3bdcffe80e3b21e4683736c81a61ced165e3a2fa10b969ddfa1f55d340612e7550144aa43868d2ce06491f2e5e089b1fb3880c17b6040343b795832e1638791ab2d12b1df0ae253aa1b3e9fe01bb06f7f306c7468bdb397cf4a9977caeb0a3c95adcceb5161f95c985b08d5d703bdd011d2d4a38f16795b54058fa2183ce076cff0762b3ebf56d8d8d0fafdd508449a2f5b0a8692eabfa509dcd0b38f09f4f99e56a0044c61c067a107857dac52e1a364ea053dcb290a7cc1c78420bf502fcd56c804c8729871aae4a4752eda8c1f78de3419afae90eccdc7572a00deb5e1a90d1b8676ac638f011b18cf42c99264d350b77a64a09c433a470f3a2ea988348f59abaa12a1384b0558890e955f1f385c05c740a0b44bb51e9cddd91bdc46c8804eca94cbf9e0fb0c18b770b70f81fe5c9c6554b3a781b22665de565d08fe0b3bf6a57943888d387c19c296827e60eb6b81685016bd1b1c8d95b29eb8c335fd76b208dbd5054b22e1fc0ab4743f7b95d623ca64c9f9afd5285978bc5635a54a70aa16e736372ed027e9518a4d0d0f9951996b210830e6d46ce43272dd0923483f986349321b2184555b6a6573bced5fc778d682085d1970f05cdbe85c936a4634c9821776b4ca2e8dbadf3715228a73c71aaa271ad02bdd76a00aca5bbd2036ef7bf949814e76561a22c2f2ebcc43c7f4af62f5a40e2df2ba612e77adaf6715e1c980aec44b1164ea20020dcb5d9fb7072052e733a0a5b69d175ba8cf48b780b371575e490571e05b3fbff92f1e0fb87abfb18f4f81c8838d5bb155942adcf8911fc3926a22d60bc9037d8eb026ea975c00937d79432be5e791ff1265b396443813020ad11f0e0ee66bcc4d68aca9ebc2b4b8aff28de824007d9d9d00a12ee894e55c565f957f5f0cff21e1219c0badbc99de37c17efaabbbdfa903ca892d5a99a7201813a2ca9cbf7b5d19d779c82af7a1be51cce30ff3820448d2e10b39154573358bb6376ce5413267f6de7d7cfcb8d4d9aeed7a0f6648834b1452c58f397ea28dba8cadd4ef29382d757b78649c6436aa3e38505e1543fad8d22a415f8c0b6afa7bf16cbe0aa85eb9042f0757c8f3ce4e0d432b2b0a328ab69529c5f8bf8da11b0b354858df07e4644aeda913eaec05fdc24b95f6f4307741897662f347ff5785bcb06c0aca0ea708cfee767f385962de34b05f897242256c1eaf5fd9382fa9f07c3b2acc2d0193cc7688fa71448b4374cc3805cec6e7b503a693be2438fb03037d7a70088dc9fe10ac37c84d29c8b5f04648bc23c998872af1df21a88cee43d52ab580248f6d11c0896d25c4ec8068afc138518f52a23c9c8ae8dfba103cc49368a2ba7a6111a8d0e154d007cecd32d9a71c3341ee238d7664d39a263ce2d5efefe4065c1654c4996e5eb10397d78ab6ad8155ab5c815707655d2a85a00187f8ed16ca19f0fbc8c116417420666e9edabb192cb81fc6e2a4fdf00bcbe0ab582a63de69af3d7e7c6ec7f23c09f02a81a221ca2d2edaa751bfd3949ecc3e81d6f518453b47911b0aa13ff53dd8a4af4b6d8f40cf4ed2f5c3e700749aa3211aab791b9e9e899b4e53f3cf1d1c62bbdc06ae2ac394be1a9694858919da321123184a8a07d01e084655b974e8ae6919709ffcc4826f62b6a5dd420b784eb881ae6e682b292d2e575a28eec33e21afe2fe17e024829ed46bb4babce2e65d97a656feae5f5bcd3f10312a5a102bac3e502a468c382349d47b6e7fc4435a8c56d61ca2c33d93ded9f2165c1f640cd23b0f36e64adfd4c5afcba0fe8cab87ba2040efc0c2f00d3fbab933303b1c34f15a60158e5ebf5c82ed18c84c54babe8e1e4910921d3cf829cad909acef813f174ea65802614fb567944b14630d1e4b063c49637e7110a2ca6de4f34935866b3ff0c3643014aba7f8ce5b2701abc1e0f9caa048e7d8fb937bff1c0319a1de8f126a16740d7f0a8833b60b56864f98ea428e2f105ceff6dd30a16bd24da9f75dea0f4ce864bd44bc52b73057527b73f35a7f9e7bfdde6435e68fdd781e82b69b22c09b139b35b5a47a385ecf05cbf2152cb5c686616f81585bafa01d067a5a086cee61113870dfa9bda1b2eb1975403b994e4669b30bd5354784b1c5126ea7313e3230fbab806e8cc7411149ac52029430ce0be92453dd7cb39026ef26451d2f230392670bdc181a0d0b24267d08861c5e5e0d00d85b84a0873c02f678f2522eb8bdb04c2624256e79396404f475be988e4ccdca00ff9c4aa86cc48ac5f05d2ff1ae536c5f576d719862d44049edeb7d25c2e78e328bff60bc1f09db639c10486d65a8da9638080ab92b3c9af7799a8149cc771857f3d36a495fd7e58236beccd8ecb68aa4fdd1f8b3fc21796e7327e0eb730e0cf78567e40a8c0842dc3a9f7451f347af2375ef47b560bf6f9cdc8e682ae9574b9d7c9cb4c764ee84a22303a35b49568d8dc89f74c0447b0f263ec71e4acc6de6e6116085b7edbb61ca4b198e2af4dba714c3fe6b9c821ca1880eb1b896b01d086e80a43ddc9619789c75ca44f8dc9d4013ed4d10c50976201e6f020d6993d42fc902b299000581b04d1db1a4c548a774fff638bccb298f45bd0a30ac11a107e6b9042c41634732855c7431610456d2d163129166cf90feb8df5a72ad9ca31a8613ca3df539f599996904716878028bd884b1a8d75fd0d3fcc6dd8e007f6f9761ba55a00fa6799b6a3ea67a6a55ff8843cfda811582ef1b553b27c05331aae09b5a46aab96566568153afaebb7b4ae5e71f7cfa6fe08aaa52aea18d1551068e25942f623c4b8e8a56f46e352cafe4885dcb1eb19c458580d2049ffd77af8380ff452acf5ab88fd52d7ef112c29ff6464e62465398fafd06ef81bd3fc2b4feecc6f45f0146c96d4a7c0f90e861a1d433c5deac14a019f50511d6ae9f363952c0ba815bbb3774c97c16038e82e39b76bd15f58f6c693a973d1cfcfdfd65ff61efd3d6ded93c3aef8a715097e97d24ddc94ba972fdd68c732e1a9001f3fcc1a71f1f9fcc1b98637899fdb949c281d858130712d5d5408f0208d62f5cd7f81dda2649edca15790c87cd4e24ba48a7ae328822f5a21e57f6fc5a6fcc71d532ca6817f6eea89f76b60e4fc7bd243c2d2163b46ec46ae4be40764f95d1a51efe6f6d8274b668c50cf1de75ca2b4791dbca7c9232d147d568cfeba0b44caf8154bd09fe8a55a8bf1bb1afa95226a827167b13f33b924ca637182b0bac8b56e03327986568016841bd25cfc769000a7c746b2d930d291ea94f371563b92535003c4bec0bea1b134915286a1665b643bd011015ef04ac9d5abd487c0c4d3c6b20a00646b476e518fc0b008960148a123365cb40be362b3b1694a8d5c05d23b018370f616496a52c2cd25021c3795baf897f812f62a5a5721ac8170e79b49cdf906bf71c83af3c445a82a9b0979506e7df0fff03405f717f51c69c995d11456b03cd8bf9395d33fbb127e4cf9d8fc8411a26d42617ff2d64e886ba9fe5c7d5b85b43fc4faf88e7b4eba7145234769d58d53a5c07d1468693b0f93bac6e2cf5a931b11506f556484824d227e448c0a3805f2217f136c1a7d56f3421588e286adec32d32422b95ce8fd81eda1c3e9beed20f03cbe487fdf2d65f59add2bce47cb5f225b2c6c09100225b4276d3cb5b6792be4b8f0489bb750f1188f371880930d79cca6b09b2e3f303f766081097bfbc5e538d3cd4ebf27befc9132225dd7428d444c764860a262e95221f0f1fe57f5ef3e4432d2be9b3c9954a88e58cb329ce9cd37f4fc8494ad1cef800a7bba8d2ce486f7ebd7a5bc9dc73458bda9e4c46c6297469cb8d4e3877ea8db014c04ebd313c6b1ab74abb69b03334d562422a6529b8e68f4262dd3ff05acf1c6d0074d35e4e977c665a26f86d6bae2c4d64114ecfb334c4d575adab7905729ecc6345e3726d7f2c361ab9d75de26315cfeeafcba9bff88c0ce812554b1c6ab0c5765c5618f1bd8dcde547b86af905406ea216e4eb454e59a835fd9648dc5c8c9da88d7a753a2516b50d93e7226868bd0c4c6c2eafa7a0696a8ac2f0f3e6958efc1e6504032b42962ba6eb3c5bf856cbc6bb090d481489c42a8e6d5721b6cc02b34d6650157752126de0cac4c31b7b073e2d6d546476682be55d764f5bb3154d70dfa9244a6fe5580db958e4a766f95a61987102d67707838b177d10d116ad56368c48e815b30fef5fd6554acfc0d9e64d3c4f6b8e9b8ef6af2e09c6126a92f0865045cf97c94070d2fa013be48df5e50bbadd9062fb6183b147f7dede8b571826f81d546abddf5de4f95a97bb75200ef5dec4abef4950b587763db4fcd61017a457c00230cb8aec3bd775980ba70362b6e8d064f81062eabc6149c115feca46efab3b703e76a9241c72f6b6810adda98e1baf07d6a7d8189f6ec869b54941c40080a91980fb827c61c1f7399539387fbec2d1d46a54b1f518859b3a385ca098b86039bba25d2e49b7968281e3e1c3e5c48f2012680d81ccedf131a8c8891b4134bdcfc70854fc7787d03671c9e55185793ff6926ae12f1dfe8cf246fcd33d88d159842e8dfc7c257836c98752b7152039eecefadd80ff76e816146635ed2d36fbcce101eee7daf1515676b9a2b203e1cfc8859d128852e25f9cf924c16d4a47272e495645a6dfde91cfeb39f4e6a1613a901e2bab7c975c885f6424b617475aceb396d0d3da14c102a69987f66f38599c60210dcebeddd8bbc80aefadb225df56b7f48d1ab0a8c92584a41b9fa726a7de8620cd32472c1b89ee1cd0e3da8b595f98672343417f766bd8d9c52f3cc1a9bd6e1c8c1e588c023ac6e5355e68aec6bcc303577faa7bff293265f9506c6107432145deedef7b254d5890c755a39f5b3aee4364373a931e98d5ec011d247fa9ef17a68b2df72810929a628f6ae634f4427c1538dd02e1c9962f33273cb6add06c81d6258de794f09700a9c8b2b6c3a30eeb00ece206d70dca75beff10e9619d80bf0a7d93f24cc82b33640aa992945eac34fff30584801e2ca0fde10854ec1c60cc5c4bf08753009063e7efe7e07a94cce2de1d2add68f2abf5e6fedeb161beb5cbac9ad02c043d3d157acf018751e1140776a7f32d71f34c05cbcdc9c08a7c7a03f596dd7164540566fc54fc1fdc2b23b14f002eff9066b55e30040ff5ac54b8fb6d9d643f939aca40e5005f1d5972feafcaa34f2a72d6ee03ed74fa5e70faa11ad4e8ad2d0f788900aba49c29090a73b3432d9ab5d933c115abe4718cc9e2a2d770e9cdc735ad5991455ee0496b0ef2465e39267af0e36c30da7f3ace53cf3f6010679001e39f6e2a55da65870e9793b447b418ea1e519dca3c2bf0e1d0b0b07ad96a0708f428173694f70a113c0a0f79b3251914d7f8af58d59d6e198bdd6155cc3a4468be06e0af9a1c94c488c9fc6b44e759e43695c0873c1415fbf56c065a3ed585a790bf38784ff3cd7baf3f4b22533d735684bbde582438d213bae7dffaf897289cd0052d6788718be4e3b7c071d3c6c7b75f6e0ff3437e48217e179e35db0f088e80c8aea5749c71fec4985d00647877c9db4a55b51f07198c232adae969c821be6ee6c2b1ebdadb00a8916b1f93b1724775ba9efb421df723d54cf22caeeaa1b6cc7567a4279647a6e099cfe285cb30cea5a1019f43cca22765a15759f20dd681057a0832833c15c54cb1e3f0196aff51abc2b0ccdf37edab8b536c2a4bb072293224e9d4e83ed427b8ab2b92f52a3fa6bc28269618922a022f67f778779bbd3d164aed6747c9639f1628a6643f47dee03112facf7431bfa1954ab2d58c7b02ee380b86bec76fb52093fa5419c17f20b123ef0b0b5c0efded93f18e2c0aef25c1665c3f91a3f7faf4dae9cbd84efd9ec0a5ac4521051118c1e28dc3282be83918c9b23e06363782ad6d6e99f69a016153f70845309cb9d8e85d0ef65aabb02b0648665ae39d5ca7ae9c4de2cb940ad8e9b5e0e59ebf2298c6e16fe35886fbbeecc719f000d9c9764f3f90f66c8f9a243bb25bf84ff7cafb76be8418da346319798866bda42213d5acf00d836b2a0487b7fef2fed4cddf10633bc7f2fc2c0e7e7c8785b9bc1eee0d2d5ba42fafd5360f9c84c1a9fcf8a76ad2916c31d66257c39a760621cd0ae7b4189e051036acd5aaded0acf934fef24fe71a14cadf03afd4b7c1752e0c2890930d3f74b2674bd6135555911face869062ba346fb8bfc45d09f224e69273d4d00d5451ba213c798811eac1b8fdbe4631313aa8e35ab728a1bb9db3c806c46db222980828ecc596b8a081368d73f184401ade2b7f6debae497ef70b13d2aba139f22f233b4299ebec79ec32f868786c60171f0633ba142938699a702eb57a26d9d6b2e955a90f1020e798b3903e9d9dd8f8c98888081174469697170c38d5737a58c8258c8a9361d270357e51b67011ebd39578f6963f18bd050d014b592dc375e006cd02405623bb724b1dade6b3cc632db58ea103ca4a3d939dee5df3307dcbbb3e3d0079fe70c6acfa53430f31075b1ce444454ab8208bc4dd2b71d3d8dec8bc4d49797d2bb3f6b35338e9f1100b6c079f327a639e33cc262fad9b18fb3746829af4c08ad4a84baf08f6cd31070997c6d4b78fce290807a05914db726d20735e0e7058f73856aba4dc8642c0fd52314e856f32e5d0dc7edb7fcf7c5d04e2fea3af94ebff28fa8e886d756049f0e8a4c2d22c94866366ab8b0350e1bab7094ed1337ce3002463e49fc894ccbfd05f133ab0500da55ee616f23b36a748c528ee8e2b792eaf869e606de86d3eb0a7822b7bcef21c010695c05adf371a88b0b36981910ce1317560bf020004077dba0bb55f26249beaa36e7da60d783cf89345b38e3c1b5928b9dcb5a677ec98cd4acdcf960d3ffd40e86c6fa43ffc198c2bb1ba99fc5fed92714591730fbc7a64ab5ef06e18b5f18bd37fa9c3d954239d6dcbba27c3081eb7944d53428bdfa189a83db26d864dfb4bd729a2ea41ec866b8814d8a0664f0dbfaad60dd54ec7c61358ebc416a6bf798fc65c408e48c785e9a0746548fa593858cdd067ae1e0b5a35e49a338dffb1aaba512f5fda377b8f3f4aa6c76f2d33a6d4fa73169a9a2cddbe44b49075efccb37acd99774e63769ae150647f354f0b4b93ff3028c66de35f1d715146cf5d5c1a854b45bb38a5fa45aa211f988b4c9daf94f61ceafbd989d168439c63b388672d2b0bf170b037e5c38e89df56f80d7c6645d7c045f4118fc79b7c667e0072500d627eac7bd3a17614934e238c2f575f4a978fd53246da9d3df02a28b9291cc09a71361b010d1605e86f4f58298cec9be2f7e17aedcecd5d87d7302b2290f1313eff056b100ff9890dd989f495182e2532c691d96aa97dbb2ce6481a0f76b4e26fcd97a02996c39347f90aadad5c4a65e62f9ba6f37fea8df342d5c6cdda448bbe7dfc4a461fa8cbe1c2dc0a78abcaa67129b998e6f9a913a6e7c84e36b936f4db32f000d06bcfe8ae2d5fac04cf45bf3fd3f117bb0b3da685e109a82f200a1e0d7f8522332e5524a3fbc6e864a86f9fbe30558b3263847d890afc1b64e835e1526ebf69d743a13717163fad0f9e058816a176051dac15dd0b7e2f0ece4d367abdb72a339898575595bad4acc3b46b597db68a5b6141f850d243fbe0b3cc113bf7eb27fe4359ddfc4ff3ef16bc7acaa0f3524f310679c03333d3fcaaf2e7507ba98f8dd1b770f36e426250b1ff8a9d4bc25c463ba8a7630a582aea3252e0ec28d656063d6177f74b1c88d457bf9059895e570cecdd6fa724d2015eca9c76ddae2798f82a181582723d0bd2fe875792e22bbd67b111812ef40703d6186261d6be2747c72746960fab45840f4ff6907949f20902b065fdee98d2c13ba04152bbc70eb415b14e172b028771339fb0ca708bf580bd2fb6a6d6efc0990ba5d213fa95f2efdd8b1c1b699841b8e154451c5de23871b54be129af8e3043ec5780cc395f325d33c4d932a30171ad6c362281b895db4b604d1d097b8f4162bca2f6da265e7a2d1130043a9d21c95effcca1ef06d47c6bbb7860392e5b77d17706b5accad18e8bd19ee8ab2e950a5d8f6789119a4dcb02ce64ad5fd29879e948be85c8c35669a06b2fef4fc27ad44a3a5cffff063f9268ba3b8c54a777bb750eac7e3f3ee767a4eeacb1b7019d3eac82fe5f943bd042063df081da663ad14e7f4661e550e495f413002a6d3eab63e159baaeb60fb7766baabab0d22b82221bc37ed6ca672ad60102c15d040e6085a1f4fe67bcf63da0a15205892a04dad9b3ea918adf24d6479fd16e935badebd0aeae1cb6d505ffc29abfff2708db39d1ff6420288b3b779d291e3ac4b944512eca4f63f4e1069281a089d91d3363d15975ffdd1b103e4e2c163bbeb915a5d08454857a9d29d24b72a7e7df6e3a7e90ed517abc95a448aa0179959285247f17cc8d0532fb13738a6a21738ebec71e2e68c55d8a8b77d456b385408650e627970ef13765744f4a72e4990912186a403f71bf2a9b8ac7211a0499266466c65de65157d36302cde084d348ba46da3efc430677bb5b34f75f39f16bc710dbe9c4a4869cc6e820ffc59239b1049720bc24f5e59395f0f0f153bdbf207df37311e0d85db2906f70645c876c000583812026239a535cc06a4a6c2201b19560bf574825662aaea2dfcfb3551752e89459e4082e9196dfbe1251fdb94b9f997689be8e8609d4d78fade40844bbad5caff8a07376bd83a13141c14d0ce0eb0a9b2e621cd7e031660970aa4be5f7dcb5d15c2bd2ede463c6fb2bb6bc1abcfcd7a1af96f1ae98ae81d315af3713d000ab889760c12443ac5fa79a48fafb39bef31b3c3b9c636927e868259e64ee02f2f9a5ba0b9f1c4b2a9e7cb48beb319433419798210d720f6879e4cefe84130bcaf22c1e270f3e7262a578ced12348bfacc7ee33573d2916ea63ae14659f467dd8e5f72115537fecc1406e977438fa47375d11d5327cf409aa1ec22b0d4905084e18135917ce073aa8bdbf4d9057bb2e7ae21cd46342745b6c1a43631a5a25baf33e59e461339e402f29d787463c8d5ac2a889e7d740b7baaa588024c683aef08e721ae1f880966e35e8288b4724d97f6feaa0d812a9e876d10c7c8c222742ed14764b183b66100f3644c98ee165abe1f36a2395279ac1cba57258cc5a26aa5520a16d77f075214e439b6eecf9791cf735066b66cf71442b377775018c9ab44312fb5a40c4833d198a2cfede24b5f8bf7e4231c62c5f33669a2ae631b3a116af83acc02b72e05819f01a5e1f0492b5b11ee1f3a73d8bd473bef885cf88b2e8e35189bbc8ae8c261521a0000cd0bebee7295e8d35df1cd49f078e68993fd10373a53eba652a3f4be4016b27961e93935a059a321c20970e694c4678813216632a684de2ba44885592672cf46e54c9ff27d01b29676ec1c058628ac1e7cb063885c6f6e428195a37698c7f1941c3066480ef3d4c8e1b601b6b65c61b21c10bb3d84d09f7e1eeb38b7c94d1fc658c57106b39cfcad009e4e4b93c6d969b0b7ee231234cc1383e71623de0c1930db8a8dbf266df0e2d924da51d9f49e836b82d2ce0bb30f50bffad57cb960f448965a23a6057140f7da0b5e29caa6f95025027be799a52fcc906cfd6f55cc96e712e11ba2bdfefd3ef150f1f04f6d8de5d7f5f9f9262ffd4c0509078cfeffc27d9bacdcbd99cfea305c080c296d6699654e909a3f8b05ec63ed6bf1c01f9b1b1ebcd5c3d34f8d5e8a5d3386626297e31f510a7dbf67751afc4f77effede7186e0ac5a05c4cc7bbaa0ca610433f49bc9518f1ab48049c1dc8e7ab9ac646e024225326431294d5335d627c3a6e9e8a06d8fbda1720dfd868c071682118c570782845edb082de727983c8e4be4aa9196046dd5a92f7e3e9a3d993613c76af2ed052681ad82d8446aecfbd169b3a659d27f0b012c45b9fd2d5b022492fb34176720daa6af6b61d245cdd44a017fcb0d82b4bc34d8c14d8c815b75616a4b8a0825658e903767625b4514c8ecb6bca7e3cf28d065a4b18456ee149ee611f6a6ed9fc8060a06b0f0a6e3de41e7d4628e915808b939e901cd0e48c11deb612f94b1eb4d589df95e2b19077aaff56d57afa46add91f6274ca2117fdf4ec9ad15f2ce0eddcadaddeb39117da645bc127188f7596ca6c7ec46914c17968e3c2c976a4d71f7f8e853a558d6f09cd504e0475641389dc5811d424893cbc25778b3f9ffe28d83db243f69d7fde1fc646d6726b7ed9ba058a2a69b0a368da3d7da417d71552e231c3334b7b37884f84d831e2952e80b10b205eb9b5c02697e110e3cbaecf4e5af641335a6f8c4d00e8d2862717d2164e4ef64ca969d66b23cdf3bf06f801fef9553859094bbc872153589e8153a49c233294fdffd46656c1304642139fecd39fbb08abd4b8730169b9615d4809910dbf0a2ccb1fa8d0c38c950265c77fc4904f97c11c5e59b9f92bc653e67bbb8ec57e1cb7111dbba62ee56eaf48210af4f5f238490a4aec16c6c60fb4d968915a5a6fb7e6767111a6dca6e279498aa016965c58939dc65f55863d7c21b6885c6c360b46772571acdd7b3eebfbeea2a681e8e10e4ea4d95e259a48bb53059650c9914c768f1b9cdc3998558b5c3fb2bb4a643c85cf4ac4582d554fa71a40235700747589a8f837ee85a9c66d18bb3d010bd28f47505c45bf7d61822152e6acd38b3103115e3f4f4839d9ed1fdc3a9abbdb8885274ebeef30278964b4833509fe21a75875b7a1e59aa1f293c9ebb12e2f8f2f112f99fa17c5eb3e7f4991416e2829f7fe1f851fc3fabfbb6c03ca56f72f11e5a21da6d3a6d9696e7de32137173b91c2f6891fe71089510ce634749312f9ac7124ad7b6757e4ff3d7594057e65742c447d56a91e718ce52eba5bd2d70c9fc35c463a9dc1c8591d8dd2092a7f6686bd784de00568fc57ace7ad9ae6805c37e8b751349b9b3ef1bc5cb2cd17d7a11f3ff522151311ed21e0b9c9c5ad9f1e4787e9cca1732f1666fc70b51e9764e66d1b9d30a1d88d75524d3fb53e5fb3a618b50200ed743ee6b165b147726120793dad8ab8b10e937e32de51ec7e3f2a3dbe047895ea4a6ae75739ec0e004cd0ee5fddea612d85a1ab88d7d2736c6e5272a40a3e47d013763d5a9b196a4c494ebb2ad4c6f72dee216b533bff8a61fb1a5dc95f39b4206ea2530a7844e77df2500fdbe7ef344d09898b7f3c5d8c79e3f9e9e99981c3df0e3dd7505696fde18c154f7e02d9bcfd47521d7381c93ba2cf41d78f561a3f53eccd577758e03fdf162e38e6b7ad8394b396bfd6aafce275591df4e8032d64784b7a731c408694c16a338d771eae93499d4051f8c668712f2c64fdd596bbb9a10a35766928428914a38b8a557856e13f97eda358b4489ff9ca5d523841f17f746948d5aee5698785e51492d8b8f6b6ec652b0c876ceffa2ed67efa633f66e21a5f435caa7a7dcea449d8e8a9bfbbbf8357cf2380a303ef8660522910a645ea39fe978baa4a3fcc588d283046b5267851f872aba05703ad893f89188b0714dbc4866be93dfb1d0d04e374ed83abfa660da4c6c609a3274e432b71475270e532f06da1210163895ef1d4a256adc7f300262158de51086124508d017712fc2eb1e2fd2d92222ad09b2f53009ab06d9bf5f3e71e7383297e63ca640e44389dbb99cf0f4845f71bcbd058bee28d4db1d80a328aba88bdd9a80b726bc51e53a92960a985e7b86ea2a8e88e6e3641180eee8cba7303d54eb60aa3860a0505a143ded66dc49565e0a80c0b31fb85f4966a2154c9d64eabf2dc8ef2a2014cee92a3ba64c27b3bffa528c9bf353195dca0e95329d8dc1d50b8d5f6cba99dfacd70180ba326bafc24a472a65a5929d7928b11443974187af4baf36da0e89ce5f08c5bd698fbfe81810bfd7762c0f5d975fe9c778e4f1166a5e3d8fe0de5a195e128bee49302ad6e1788ad555b9ad8ca4892d11df7867bb6edadc878894a0e199fb4bc05a34e04be99f27af0916cd68dd2fed1b2e9582cc30b8048e2f848d49d2955fd5ba97f0daef913749324112ce2864ba84998510a5281c1df35afedd4f98e3eb6c7b0c0a98b3477bc07e074614cc4d85fae7a151dab1a2ed42c43a38659b2fe859ddba5da7d4f2a8f63442bca4dd3e11b4b981071d764b8e02feed5b956eda0b872885ac801b678a54ee120e31429866ac759f6f373a0f1b95a3f1b42c1087371758e01278a69eff2eb0a2f1221629d020c7754b0ab0de3a0d6a0d2cb1e90f23fe08faff863bac1c837bf6696b734d066596022331c3d1cb3c3bb9be964e396a1e856553b6d968b73066aed50439d8e9a64a332d02a891c1d6e29a81e0bba8ef5a9f86683d83d72391b67b62d1780c77b6457a265da0b3599e0b7918e49208cb5cda359676c8d96191547ffa8cc717cc7b6a6f449349e1cc4beccfe7613f0d3b715e4882a69ef9173ac2c261cb62291602d61bf53ad9652186dbde45ffb908d1316e4ed3c1d0b21e95ea66745ca0f5d480f690d2c519b595ce82e967644cf7b72c9cdf158da5a7e8443a6c7b60c129f2063cfa9b9f8989065880eec8dacf623e93db8e99c09cd5d94df9ef277ea6471ac2911a3c86a92831fbcd52e3b3af31ff8445f043bc48bedb11069ca2b250ea31fdd4228cf2f7735b6012dd9027594afd09f0b5a38c1675fa7f6035d3b5669fc3375cdf438e635b62e7b4ddd003c8e366671bc8e9ef38d448a48e52feb48510daab05d38fa18c7d8c0b3a5e8420f933737a145de6130c74925bdcb3e305a07202f91385af1dc4808d026d33e6dc360391b8358dde02b04e6935c783280eb340fdfd4d015d2e525dd18cda917730df9d19b7eb51ec0f53b3aecdf46ee9f68fbfe0c71896553fc8e85115080ce5ae3937d69820757d54b4ea04476815a5321ecfa8667b5ad5059a4b5c9e4e0968a38900c7faf1d52b895c8420f1ec7fb4839fef81dc2825e602ce89f3c06902b61fc0aeba09483dadc596819019c54d2d1c52ef98bd2f7e6c3053daa2cc69529515d9cec00aa1a6aad3c4f093857fa82cfd78bb540772400277753a1196bd4005a91a3650f65460b3a9a36d6c53551053b95e24d1ec4d078cdce647198ca0463cd7cc0501369399fca08aa9df985e11bcafeb40899d419a851af6398eb3c15ce33a3d90055706c1da634e3120aa28de3eebb9bcb14e7dc2e11834b12347dc58b2292aa14513bb993b78f8121cfbd1778e1ee331461a556887a63c6a67d3265080f3bbf156f186a26bb800c35ac68c0a472eab420aa380146dc9076bc00c65e75e4dba58475e8b2c77b74f292db225fde4f6d2a959f162855519f07b77677a56c7e0e91c7154c9d20e400eca9e868e8cdc17027ee04164bd29678d7b8e6319730f060ca1b246489803918f62f9b7d759add3f3f4dad0a6ef1de4f4077945db34a570cdec7f7958103e0f73ff1ee8c466ea692d1dfaedf7e7a7e94484e1ca6204d044f468f4527844f765cf4eab0a33a680d770ad3507002e35ac84f6687ca59e4fcc3bb51955b2d4d98068d5d44a46ed5ef40704d3fb7d10154f4aebeb5d6a305de2cb6b2711c5770bf878f39f35779620b1d695c2904da2f6a595852630497caae4cc9a822c4751b51cb69d635e6ec47d6972a29c59515e2eaee01a5589c03bc24916b76c32ed9b78950e910211e331b033c052413e24ae325af29db647dd02ca06cc5224a8ddd55f26ac43a83d96e0beae9d7b9ffa31d515340cce114c66a177f8d7c291bdd49c1490e880d8f82ce4ea6f7651404d81367362f2a3e9b0ce311eaa8fb8525cf8690a8f943ce49bef0aa03caa44fcb439b8b7a31a72fbb61208a04697ca3bbf8b5a0606341a0e784d6cb82b093b274ebb4cede80485b612e321be1166e3c84f2bb1789b343863ebaf12ca70a92ac55a78c7998764400fcc9812fc3e8737af721a4d5cc5264f3a291f25e2b52abe5e07a38ed0932614e87fc1bee6b2a8b66b83fbaacf3f1b49270f8c78c5468ed6a7e4d2571d60cb9808c8df22161e553f1fc3361b0d4227e26d087c80693ae4c4477afa54cc53c3b15e1b3f4e137f9366aa52ae0ba3e5f2d50c84d243d55326218faf8ffc2d6e5202bd20e4823f1b4574181a7470dfd658471b2655b40395dc6359ae87a53f19edb007b977cff3c4b0dd1b2b23d4f4b5103cba48612cc2a8d1dcd208f85c903caeba0e6d3a7348a6129c86843df4bd2b5a50699955e9c1d6c6200dc5bb2d90df887813da1b9acc7678755e24da71ba4f60720b57ac93e7f8ca9e4c9c0be6a608008e5f5ebcb631542c9c2f6c408279633b43dd688ccb4679ea0e0d60267f194210ac7d7ff258f76525bb51e2ef7d72bb10161a72083e7de7ec3ce96f53ba4f83eed496525ee2ec23ba0e06713cb094637f2863d945432ccd307ef45e62b25266282b5227cbe0c9b27e2eb55c7c15510ecd3145c01ba5dfa6b57ba234d1548cd65e851953e0fe25805acbe0be413d12526dbf031d07f8e1177d3377a2575fee0dbf74eb62d01187af05ab977b1014a5f52a5a6f20de227f3a537eff328edc4a170dde3649d6778aae839e1e24793b44b4251518f4f39a2d87add841b3eadfca7f57d968e27587bcdf516b425e59866f31c19c2ff71c575fe262536499d92873266e559d4bd873147a449dfc72d80770e045c2d02bc3cf98270d5b66031cc3a8020e688c629886cd664a2e9e01491262a51d5472440257dff2e991101178abdfa061850683747fba1575df27f75a96a4d8aa64da924bb79ebe2e1e23ecefb00e88157f648c9ae937a5cba7d26dba81f9fcef54a4d550b6977656fd6be5226f77799b1b731f7f6f9ead317bb6a370075e4b5314829a0bcb4f67f35435df3a8303081a1d427409b01ba7b9824af827759643cc07c9ab6c20fdf9b94a54a3183d21b6f475f7b7cd8a515c1cef21b386368a39d855a92eabbf9e691ff24556ecaa9e551a8c415d89a0305c15cd8fa9838fca767318f14de9197e878c573bcc853a83107909311d62804fe87c3bfb056cfd43df4c09ea3a0d21f933bf722bfc924d1430ba51efba89d0c5e9450eb71f9e016ef8833d0a06e59829e66398b1114d39479f03d506394ca034388889b5333f1d0bc9fd8f09b7ec5cb4589aab56d96b2a2d16aaeb74d81a011ad5e54bb686c1a8df3a1447c7dc256cb670644010f68c1433c187b32920b9311ed70434f597258ee69a55ee5434c4c80623288f8cc9889498a5fc6653f4b823d6c3e6efe83d1bf4950ec13f9ffed06013b0721962ea59b8ca86cc06f05cdbdd0d2305d93abac05726b527177683bc28b149ffe1fafa89c009dcc0caf55e1d9bfcd1c4fe397d3c5fc0c6da383f4c41daa66263a471ffa9d981e47f85ed33653fdadce24b56b94fb30e567fc6184e01a8905a7aeb5925859118a1060295d50487ba0c1e76ca8f99e22f99a39b809b6505842261b0d4deaf7d83d2fb26bd39d2038bd1353a36ac970cadfdb87056420c78d63ea2b2a7b8289306c163ad35031750bb6adfaedbe1a7d51f5158cc4b04321c13926f56809b0335b6d88b5f779906cd0fcd5b7c0f0bf6d57490865b51ac8c9710997aa076ad1c40cc145e65c02d25485362c3f949763200c123e7cf1bd09cf556070bc874f0ab53e6988f439980de48974db3aa17f6137067fc13aaa24297473b2302d7b44265f473fe4455ee2f9d773feb52ca364a20df1ed7c6c78be155870a586e2132871ea4fad2b4add1d2c7040b46554c5b8586744dfde9612a76439e16bcaab8daf5cc20d89f880251a9fe6208c314095da7ac5ce369c57a576361cb1f66fe1da7513f997fd3c6e77b6d166592a749034ea50feefdc2f7a1bd4e6ec60fecdad23fcfcb829fcc8eaff523797d9dccc24145816b74161f3f6c47ab2b8632b0dbfaf01938edb025a9c9dbbe795dc542c24bd7135c7c5bf361c1c3bbf4a50497c9ef18ebab83833e4452a3df9657850d114a9d102ab023ae9cdb3db837d1b321a9bd69d9a278b97d1e086a2401c1ff69f5b228bf2b6cc7fd1e4aa6433c0bbd64a74a42591dc0ddf278cc12313d7d1b81c316018206e1f349b4ee5e3ad47562795c9478d29946e442c4494b6b6ae6415258f179cf340a9f99f9d16fab1a9f05726e37897d034d3f9b469daf9fe93e4c3994196a07c5f9128f04a17a8261a6e527629565c2890eb803722ec91e30c06ff14f407809e92f184c45440b20cac6f6be27fa691d140e8e584b623ba07dcd1ce6103c844f125671c253961ac00310fe5f4ab96bb88e7d7d7e1ecf63b5af80088110724d6a5ae7a4f6970cb920b3c055d82daf8e0b1ac53aa6679f5ac85959ab6264dcd6528d5a3f1a7c7fb9fc0e2ae9ed1e10a3331a450d6887fc51b0861b5f461369ae74099b381185fe076e2ea69b9eb54a699c9268fce1b3a07daf6b5dfcc4c02975307c9e725c3047e0fd1bca91f3133a5a14ba5cb001ed0523a95984b1a5c1a57bae0f3f556cf9c0ce59c2c4f892d0502ed46471a6745a5228adc2edf9f892b906b5c0e4e033feea3215e2b140993432d4c96c91e566cdea64a5a43648440d6cdce43c803ac6c3532d860473abb463d0737e6634aa9b20c78e73c3bbabb6cef59c8dd38fef882ca0c68866737731ac94fed1f8ffac930777301a35eed5c538ba913a1c63532c5fb6188b5c16ed280267439dca48f966c2a43b4ffc61261a17aee54da1afa7b5d2a92245beadff99989eb90a7c1acd3c6a066446987f64cbd6363bf750761e4d7c6c67f15118f782c7b9dff23b61bc124650ca02f0c8390dbe4ed73f994e1e5b45644838c0c6064624dc7761d3254dca99938bf376bb979921dfc19864a0fa2dbee6eb33800c50e4867e4ad14604e053b9a6339d5aabc5fdfcd160626a11e805572666d182eba3d983ae48df106572c7dec35eff7078d9ccd7e507c1e9a6ca2407231a0783bf13d201c4ddae4f9b77b4fb855f743aee3de013ba45d8a6420a476e52d38afb23c75f2f1bffc4f2ce861daa4ec733a757be06c5c63d086081020ded0e38a7ca7ffd27ba5cb21bc403666f301572e1763b2e60a7c0847244f540786740d26f0d1021a2b81ef853b2f07109f7094d4ae75f4e84cf1bd63ab94cb6a42c38b9825572036ab6961fc49dbb24094b2de3f3365613a04e557359ead16d4ab1e73be6dd71f37e88123c8b94c25c8b2bdeb89c517e413d9d09c6cba7aa3e573a1f5621948761455c665b713877db28d7c062ad721bca8b7b28ecc060b8ed68b461e9db67d4808e9e2446ff7a9f2e59161e6a0fc484afacee5843ceb45e6fcae60af3ddb9749f003d9889039039fcebab673512ecd739ff5b610a9a90029213e112cab2d83a709e19c7ab3ec16bb60b0a53f654f55ad2b734df700a100e5f2ccb0cca15802cffdfcc8076c8f22dbf9a8d42bc6e00b4548acc9bfff67c5d812ba4b35991d6c58fcdd60cd3f708e06ba59abe93bd44831cd6e403fe2d71b54ac7d813cfb4eb047bf799bc95f460fce9549b7a9a489f4ad105795689cfcdc9225ebe59299f6989b58a3e0065a9f646d82aa27fd954f015889562bdd4f897fe642be846cf3afbe2acd4e2e40e842ef4a44956b251a8bad504676ebbe99851701584f2f4f69aade1ffc639cfe3243729c938c15f26f8c8571b5ae94b02cd95b26715034390a1f1648cd35b1f0614baefcd2d7cf27530d6cf8e26f553ecdbebecbc1f6b0f2d3f152c5add956bae4422470d5522af30f13dbeed7580f2d3c9404cdbacd60bba697e85aee7e54ff7b4a6217cd29730c1ab867cf530de44478ab8c3e57c51866136b0497b89749c72c2fb8ae2b9cd77ad8c6d1af8878b66f64acf9df52b15d9bff07669794a751cf198cb5b52228d9e810321dde0381b9e294a60651e199db8bc0784ada92d86dbaf246584dc6c482ae93fe74cfed9d2e708f49de7513a07cb38724c7ae1cc3a2648c1c394fa85c56043060ca058bf7dd4dbe8c515a8057d7c56eed326905f25f00d091a9f6a2e5c528b670ed8d20a1338100dd2df256b7038ca7b92675138ae0283cb9840c9363a320d4ecca6e37bce9776ea21add8af8d470a33dea35c40e2fe88952bb3791de1677e7b9c32acb116e2282c2c78875c685ec1621da3bf69c3ffd3cccd9f0f0b08fe8f1d126f9db0440280a00dce41ed7a43ec3e6429f119ba69c536d6e384fc39715c54bd37d0de9232dc2cb4be2c437cd2b225d1e663e10e49c3de42bf6bde842fa49329adf64d81b1574c368a443aca940dfbe491a33b63db32b3190fe67dfb7fb86994eff1c294fbcc11ceb35ce80a600f80b8c79e60a88a9a38856535203daea2878362368f2e1441f5252878b016cd943828f2eb46da23adec24265b6af97693e065848af0157b3a6a6c65a04b0bcc8755eb1acfbec2792364ad0ad226d5c5a3e7f9ab49de80a49acf8aa5c7616bb4a67c26bcbf466eef8be47fc155ef610c790591cecdb2173295bec56ebf4fd91ef9fd499fdcb68f36e11e6c618b84692cd0ec332c32fa652d952e73c3e3dd35c55a9c05f9b049821cefafaf3a59d7680aa9ce02472e2fe5055125c9b9ba2a7b25d5f6906cf88628b994085604f93a3f72c71d81758c471ffe2e3aeb47a8c17fa5d75276d4fb1123b94098ab68066b45f387ffec1d1c79ce8d905705fa504c8d6811cdb28ff827c1848292ab86f43787157dd05764ec1482f6adcd99c3d54b85c1896083cc31b5c8026d377cf8a4ca5a18cd75f84ae7461a81045c0290558c20fa6956c4f58755dda891ac458a6c915a2076467e537eebe355505fcc2c973695d7dea386a52d2155de2dcf4747ee1374bfae34f1e26bc7f26036a53735013c670e5a97765f637723a0404931b578979b94f25de1d78b8bd6dbc8190112f05654fcc37a2e3af0cb2218c27af91d96b4dac8c15c7891b08e339780fd9cbb3fc54ee9521ec8039151ae5b447e7d818535cdf3f51fa49a9099af7774862866a17bd8cc15acd395773cde28240aef35970651d141b1b4dd950f79db94e41dc623161575815f52f34b2c009c622a8dc0f5e3841a36edfa29f450341137d0a61620dc62db96d6a54702d96b3c71782051a54cf1dd63fb6ffac8adc98f0f85c2d472018d4129e2458df225c357e4c77af6284500ccc6512dbf2368e1057a2a1bb6e95cf5e2421fe6f0b616ece11b16ee36e39ac2d9919423c7d59e77810173c6d6395a93592b4626886ff32925dfc8d6d252ca7b642a8f96bec5b034591c8a8dd5e5bef050e3250fca3698de501b4147c104889e5653931be758151adae8edd7c7a859048951f53eb462b6eb17b571b9324b9e45172bb5b1c93c6923255fba2305ca28cde0c57ec6da95269c836cd41e3cc9f24116267ca0ccff81d644843f10689364df823e60110d295da8a109b616f77464182f1e933abee28bfbe3e893bd059ee8983a0c28621dc1d734c04ab7e3c39650ed778a7afb22e811aae45b0cbd8f2be085e01ae9ae29d98ea42b353f053e1b3e62f0260fb4aaf91c94bedacb06c9814b67792cfc18fbf0c74004714de8146a771fee831a8819432a549765e3d98e0381c4a7595d38a2415dee9b38714ba48f3c1346c2e5a92f5a8a80ec390e78e5faf01ef784e7f9a89746988302cafe62ebc6bea14110f831a65c195a164741beda5d652b95a05b22573d231f7376b3b80335d3fa56e8e72c2dbc695f5252b01966864fc7228549da767b82d7752558f7ccdee1fd86cf25b09c0bf84e6286df14c5cfaedc4529f20863117eeab700bd3cbfdfffa778aed414080fc42a8bdef1901c6d770399857789d317faa24cad19459b7870e7acaa3d6eeab55af56976c683bf101caa052643c878fc505476e8e9e47a9cbe4a9de664d58c79c5c9b66a524c631975db9d4bab2706e97e207a4acaad781d453d39f7a13297459ca8fd3c5486210568907e32505764e8ae1315c2c38b82b8a2196ddb0ba106aadfe33e9c80d6fc404353b4e44bc6695535f505b2e850f3db9741e6aab44cffa74ab724f1a064f4a6db4f5ad8eec214dfd50f7a48b42faed430a590e582fd8af38c59dc0732f03a39130abf80bd7cb216224990b0290f837c605dea7c9ed496a879ca50756c22a92036789068b7ee0b4680d98b0e5a2a3e3087a6eb25e717d18f393ec21ccb7f3e4216999d30ca8589fc7306f11d49e2a2b7c43302697d17b789c3bfb8b1cdbf4517033b234913ce80685bcda0ee097f8a669054bbd016d0f6c307acc0cd308d59cbdf7f87e4aada45e74bfef42954633481911d034ea97cac9323a4799fa82d4714ea6c8afe0da1efa2e9d869e1aee36a5d67b2d0511f77de5d325ff0b42e06c2bd8551cc0cf5cac7c958f9a625ce53dbf76217b52e473d57d1c906e24aa8c34d192ee6fb88cef39afd66b847e6ea395eaddc45d12a1586eb769fbd21b955ce3a499ec868130c8a6f22abda5a5c86c7acf53fec0d1373feecfea2a35039b1dd5f875e715a28224a278ce96ee79c13593e2cba3025232e08e9214042ea99f9380e35587e160a00b41b70f1b0eb4dd71b07336f46079c25be95471de8b42a9f4fb03a1ac104d4ec1ac2c3acd51058d10ca9d3b7b5657d7dec74845d0447fa39bda1fe7dfeaf26daa8fae39fbcdf733ef7ce643572c5d5feefb350df7bd18c9235a41ecae829193e2f47b26408a7b8e9e844158ecaf50b395722a6a476a1bc1212d9b3430c09e802f0d3ef353abbcf29e0fe0358237e2049d1f93e660f5ded31e438b8e7393b68cc6880d4901044081464687079bb02607a4977416ce5d1823d1d9ebcf7562219a2bf767cdc7eaf0a159fd12431106a23e403812c4d948908132242e1c97fabbd69a565b58e922d13a728e92b04c877e05e6e4d877a9d0a3d094305d89495cae047517463b8cc04fff0adee7f44858a6acba6c5b763447b03a42c1918dfb70f54123c18920b0597363af65b66eee6962d91221d23565ea50462518a8e60fc5ff7964e11cd80d04bbb2412e29933c293db3ec78a04f38802ace93251af084677107f9b580f4890a1c6bd45e3225364a042ca09a6a6a5aa53d46f1e3b407fad951694d4c3742c43e10125e8699f48a8d133b8074995abb90e6c1d757aa773558d4a4aea451dafe0aa9b4c926efb29afea8d85959927d431b3809b69c2e65b59e30443c66cc6f864c6eafbd7ef32c8eb7a1dc6a663f5e02acc2249a3a98c91ca21a25544af94e246616c099a4aa12923ffc2ee23a3694098595e2b8a06cd236b39c4977c6e3a1e0a98b4120a0c360bb9127e332cf3dde68d99cb086b9b0ee25dc287e2d3f5420330516cac8a4e04449cb6076c795274f1c54b0ff8d554f38526b09eca3771606195c5c51c7c995548e91171002ea86bd4bca9c893691fae0f689feaf12201d31d0f2a1a3a9ae7e3b70d787bdc0c3a2a76c9b5713ccac9026491bf43b5323140ab2a0547d84ab83a48369baf87565bd8733c6fb9cad027f435f9ef0cbe3c402e5182fc8879b7216394b33b855f48ca8b1f1ac798bcdaa6dab95be3da780be57dff876a641e71f5da35da0490d0639b9c178c95fcb0e1602ee3f645367b2c684b90cae2d4722a1d54afab89642e008970d172d229c1fa4963635b5735e3c2c4ae30cc47a0a906c85f7b38a9335a24e87c2f74aa5c94902d4ddd087a9d5f65cc3fd5cc543545854a47a4d0a53ca653be46c4c0a5bec89c253344b000bc86379a86f2fabde29f2b56e08d6eb3278689e3611b97b22bbfee3d3242b7451af288f34c3ad642ed7352f182baede02a5deafa1844f1084bc4b5bd9ebac1e5766f7038c65868c970dcce1525c4ba4557cfc8647ec40f9043c4b7027350472693fb7371c7c212a368f1191f1cf1872aa3de694ebe05ae0a4f5ede7131856c643d7bec87cb58c02bc22d4df105cdd1810d4b9c07fb41f4cb824c03ac290c3a9d5a76492491616355679ad42bc98b06723ec035049726cc3ffc72072ff46ec39a9e829374b6545d5a2b5ccf34fec3f1755ca0e6e5b228e0674d8df64e3b8de4ba669490198692837079a8828cb0c2090ded5cdc360f67f21057826e4834901f4d306114805513678e4823b290a28beb8204ef99ca8e0d6429c7aa3e2d6dc5ea23ff89d325352fe7c3aa6f47f67d26cca3c51c383b62d27b009235af15ba039e84cc5755e61052f18ff2b16d2e7fab90e94cf30c36b68c2368727cdd247ada97ce1b5ca19e47f42a04c49c1636a68d74e5cdfb53a237d65d3dd421b24ba59ee8f6d47bb3e7bdf2472eefd148a9cff0422d8fdce5a87c43ff8c5b33ec890e619a190f147800cab6d1835ba2bfe2d932e9e595a87246346c5468f1f7db9bf08cb1158e2dac85ccd8ffe8189e30bf0487cdbd5d1fc1ffe34130b8b1a2191c0858d64f1e216a45fdd3e5591f787914cddb4557c88e6f5781d486fbd0c2dd7b68a9f3a9e05d2d29e7aef4f851d421a26d826fb69d1063815db49414296c7a930467649f5b875cac06134f9bcbc2d6bb9c88084a6ba106a6542bd03a786995d03f8c515cf66004b64f5f7bde8986aa02bdd84af0c9f6f9954e86f046950eb139b09f270be9f4b5fdc355a972f0e136144f1fef3be3d48dcf2929464b8bc255c4e814f000db912e999e59d37c272bd5adfa4f68b237bc851c2510b358d194adbd97f6ee38458de219fd1faffa0ab3dc0591aac11f61a3a9342c085d23b6c844eb3ce8c0dcdac17553eb1316d89ede3c84622224d63120f1a23cab58f5462386ddb407afc118398e304124df2358778987f85588356bf2a89874b9b4f83e326e36c9dbbc7d761fcb81ab62a72f0aa03107a5410dfbdc35b8c25e048c25ddcd79ad53ff6cc1b00c294b420c15627fb66d76f93fba4e560163f51766fa15d207b63ade8db5d216b17160b167c098cbc26f19837e15a6bf3ba37f93d5ecce0c14e2c7c780debfa99eba75add973226988bfac7abc0d4f0418469ba08cc4305c60672c97bf71e832de7d48b7cea61ac81e67de5e4971440342624fda46bf6b8af196827b9f85b0ddad4746b67c4ba2d7d4cbf1e7db99ef0a787646414d6a779a05643a821e6c7d22cdedf473e70050f4953d66df272f74676904ec5129fd5469762d8864a3a15819ea7c5a1716b628862e2a4c318d7b96384b75c0de290c035d3444bcd196a3f5ad1464eaa0e0c8a3190cd3d00f9c5cee18c86fed91624784685acbcf82fc86a928449460dc5b791da0e973f110c6e7230bd5b3ec98caafb6d4ae0bbc515664ec0251e66d8f210049797d280563418218f07e430ce2096600e2cb2c797230b403f21ee8e88d2c3b03ca7b3f272b0daf2ce1c2eb069768d92199b31fec315da1caf22e5a422410282772cb91f9a52f7148628889077b3f81d145b8721db54046fcebdf6d9c358c1578f120696e661f51d1d99a44448873e45f02fd7682faf0b7735c9867aa8673b06a91448f34e3f73f997337b47e4aa66248682d88f24daf2bfc0deec8d8a6dedf6b707da048eb899dabb34c4fe53de0fde66e2785d21c790ab1d1584bdfd96906a3ec1c269148a6943da1c537baca09b8adc5b6ec812888e232c76c29c0db0c1c18bbc93a81920c6509aff95fb46704b342b8eafe9581c43d61a65d135da188d4d942bfd0effa1db8e068cb6618f8bff6c0fe227619aaaae571601e749fcedaa100be7386a3c8b68694eaedccb2b9d2e0a6356a0f8bf1b7a2fdb3cc696321fb76a0c35e3f3784164ea184229a60deb76fb919e6860813203a9cd502bb542a216ebe2a9b458daf52df6591c6c5f16ec34b4a35f5c0b5edc4868fe788465f70bc7340ce661d43c178fb6aee2569d4e1f4152d1acc5a32879a6c28191828a8410d28959acd2e51a37619f3ec1c72e425a37065f49a1cccafd1f2b517c2f058133b0a36ff95b6d16274a7776df502bc3909e67bce5d1bd8ecd3d86dec0344c14448ced0428b06e309ff6b61ed1e128fae6728c921f3be87180fbdef2faa17014be6a9085452d7ab3133f51e41ed39d14972bcda0449751868f847a71166f6336df799fca7118e8b474e077d2ee6b73be947c9d3e53d662c915cfcff1f09d67268b0f2767ee0dec62708beb43be805c0b4511b97979176df458fb1a925ffbb05e4b7c58a20946a2ae788f8c4c1559011bdbed1cdb72b7cd8b3bc07f4c281a43ec59b2e169ea9fb9fe106257e8db9207c739374535f7731ff817fd6a97da5aa710192f4d4a88abcfc03ba764bc7e5b372ba36252ebaa2cfcdb05aed4e0b27401e1befc84ecdaa343a4a8185f6f0290ffe91d75b1b2518dd4550a4473e48499c5a92fb457ad30aa3943fb505c14649e7e1c73824a409b28b62cd7363d112292325edefd2f03c936d84995bd6a9d1654f69ff2305fddcef8421c6fa5e95e0804d21326f29090661e8b7d29acad4ed70088e0a02d9e0c20ef28bcf6c6e37f0ea5e8d101018274b1a9581cb0e4ffc249c6ff21507ec348c2b295e0a78295c70db6da3f61e3e060097394d4dd297c791ef4b56be9b01a29139fd0b69e035c332179ab95b905fa9206a6469c25f5b040e6d41fc75c41af2551b1e653bb4cdea718bf56be7aa323ffa7caea162d9737f25854562a0e86ff89bb5933016132a74321b229255a7722120b1cabcc76bdf4bab94b18a321414558f4363d700eaea6b036f292ab2ccc250a1acec76075af3157ad8e301d6c8a38a4cf5c3de2693876f0454db9353919500d13528f47452c4986d3fe2629a3449e8d878f64d29b34b275e4fe742363f99640c3fd23b3d389f23ffdb261c466726dbbcb3c34afa274b28901d1ad577fd38c81fb19bd7550062bb85d31b513614780a02b6b5e3b5b7887a79b97532d503b43d1c7c48c96829feacef3c031665551659f32875674e20f38721cdc1e641ce9fe4e9dfb9e42bf08fc28ed0b03ef218d0b0e127b5046a9b965d8287fc07d20d688150ca006c79be06c7fdc9bb7910613ff3b5ba73d67e8dd2657407b021cdbb78ea5106f1646e9fab0fe2816f78a750ded955e761ba85c819d46a9e2a5ff21cdfc247b7350b0f8ecb1b82b1f991dba6d8b1e63cc69d4a7da94a552e695c6ca72da158fdd2260128890e396f7aa3b62023deff2db64c9a39b6030e9b39d99e280a4fec1683e09bb3787305d649f7ebb7bec1c75b1a6ea0259b734c14a0a2558a99db4acabfd497d51adfa4a46fac0c29d21fc027f0488fb7a2952e576fc9efa0c6f3bbb9725ee8556fb5ab129aa3e3ce912b2df7fc3c15463f649844144f62493b9ca098c5bca1e14e2148aea9ef0b851400b32db71827c0b0b5f8347f36f3e78f2f165f8e3fdea653ba81865efca377df1273b6a1f5df53aada0cc162aa096083a8ff62f6bd1096861fb1aae2851b4e55feb071284c12c6993dba58a4e938ec33d897b5333d67da388a69569a5762165ac069b0f9c00cca0bd1139c96e8265c865c2f8e7c39063bc077f795749cb6076df4588e2b2d07853a1443fcab992c7be89857a004fa930864687868405f9d06cd44a0122e2df619de0c07ddb7bd136ef66b5a49f7c6251915d5361fbf75d8acc6471b2aec8c0d8499c78ea80511fe930ed6f8ff4406b5c061678c0e23dc998804dcd4c7fc166356e536d84a59bc35fd2c111c7aac8ac8c29f5310f40bf0161bc7950978b886f0ce03e2e053e0d426238e9401c126d362e59556ff6bbdd7886000b65fde3390be7c2e91df00f2e15bdf77fc84040f705fe1756c4402679479a18fea45b24ac145764d68c03b2ace1ad2a40c67b027b5a81c8e29ac5d69ea33c39e236c7f906f6a8445b7a88ddcedc5d7a5b3326e9192aaa4b13e12469a21b34c6709660dbbe4844ff9aab8c1af58a076ce7dbe92a63aeaa409de0aed0d76b0da0578f55c4d6cc5b77637710c3498c8cc4718da0efefb279511b4a026d613e50a3fa51401fc786f81708e619a9369b6d9d5daea06836850917d835304fa3d6dbb4dd72ac7e624587ec2437f466db42e2d5c8bb03eb389c0482c087b6c2ea1e81f13a0b3772e452c3d640583c9705267c10d4d5f88f8322d2df8a55ba2b2fd5c7cb1b905a0c2822bd46d86e73018d96953491224866bf73b315490b2cacc59a13c14ce68372fc66c6f76a3ad62c9cbf734bf90b44a0c04f2f7545d501c91ced47854b3a5d3773420c653558b73d3c59d7d3c1689db1782f2ef33fe06b7418229a34768351cf11f61eef9f3839d3e5530af4d089305a32ebd80c97223b67047148a36d8c3eca73f31f2d94c04d70e89173ee68501de0c945b74530795598204e145adc81502d83c2944ecc9a6c42db1d7cd91682e05051e93f714505d75c1553d85e4217ae2af8f40110cc1dc88a3b34653871ecc50420cedba771ff2502b58f3bf353d62b68c365f4c7a6603f3c2a238d3e98594f1ba6e1b08eada2918519a628a45ecae4b17fb39ec117fa16c9448fe1d21645120ba850e71e2947b54cf87c599a6a2827263640041367784ec51b9c37cdbb3627f76f21955d9876ea0283ed22b5a07cec34792d6f9dbb505184eec9ef7f35b8237fdaf2b05fad8d98ce61c635c10fb5d803f9096ed9c7205b421482557f2f7c6807df1f893568181371df13935446ce065beb87a55c2dea524b53c6d4fa06a7806e31ddd78bb4704c5764b66c793128a76b159d914f5d76543df761e1db72935277f57a7a7b2ab9e7fbee199d6b4638094cb89b66fbd8c82e179f53234e5abb6ec764690885115cedd1677f5c8b2887ad48de4af560fa3fdcf7350cc5e6b6b90a23541c6174d906278d63a7b850380c412984e8b16aceb3971f832e85ffeec27da4a05c46811bb9dc4f3693f6036a1fe551da2d57544f4c85708b06f137692d30fb2146cdfad11a65ecc4e0e1afa9f25ff22858b14efbec3557074fbbf067122a39370193dfeb1b41e38b24701506d64986a4cad8853a2a39028e29f46e08b4ea0a88d180c6762ff166212ce8280c6ae78665f9c70803a313030a3e69c41f93f246738e7d5f9862f9f1d126a5fa1d67b18c6a6480c8ee7f5f5b5d24740b6d55fb64acd9435b7d0b6e13abc83a76e075387f6b93296293815504948933d97c33edd95a62f0c28db4d179e49bafceec7973b5657285a7eb9420b22caad226aa8b055495eba5974a94b17f3c18928539f7f4b03e140aefb83f2d5c2b96f74bd2689ef465777f03672d0d744f2aa232e851e5da6dbbea3ab5948b65a60872de801be0665553d27f8b831cd1769bb4cd61140cec1c9bc6677091656eff149a9546ccd453beb00c4a1851f7a67921978c5ee2ca83cc84ad7c5687c556f227f97a6271f072cab034052b22046be0bfaebad6df055d007fc5d7b6cc63aacf4ec075a0e93fc4adf32819397db79d38193450e8fe88e8effb71030ce29e62d64497c1198f8190d3b8b25c8eae993fe86e3ec3519a7a56d533462bf20b7066894af483442d6145cd3702592f6ce789526904b9a916e1c26462338ce9dabbc4ced46be7db7203dbbb84a3bd575a5ce2a624141e7d57ee41481a24d9fce04a6597a376d843ec7f024393bfa4f043a3f0a0ee18c5c8d990cff3c9b6bd7caca182fdf365d03983d95c5bf21bd7cd1929e57817dcb8d82e932e9d4e293f7c7adbded7646c56728c99afde5bdd68e219a10fa986766ac55ba1f05e6e73f0ca5df6826258eb31d002bfd3e0500171cdc9f0dd4fcb9955a058f83b15444ec721c431b9dbf103c252bb34ff11e2eaf153ff5a061dc20f386297e36a7f3ca746aa3a135e479e0ba55cceedb69a7f7624fa975e048d763b3fc94aa7d96da972ddee7f91b7f00d6c1cfde389f4ab05c799aa106556611cd123a26ff6a23a4057a3b2ff2569dd14605968e76993965b7211c5b7405ff5c89cdcfb36283f7fa82ff1da9e26d0269fac8daf9015b93b3b536c5b00a2c7427e199d9807be9893b67f03a9a1970a1a046887e0a8dcf4e6a2cee57ff26b8a664f6c836b28b20082d0387e02d6d42adb8c5f126668c2292cda1123b85e39ffbd389d832138eaa1500b06f16b0d0e5505c970152194e30f8bc3a2ef01385533daec68f3246ef72956036ba3aead3d62e879dcacb7f505698c6687996ffeeefe7d2a0c3648968aec1e2b864a9b36b8f08211e8178883a27a079fe072f08ca49e5ef1ab910ff56ac7d4db6a0e25457c230cf920acad2698536ad3c6bbea096729e2687057b1d998103c0dde7df3d699a35e5b7a297dcae7d42dc5e6a138adada3247fd200f3060be71eaed95f6e17039650bd67ed21569598bba030ca1063affaef3ad2f17d74d33508a3c74b0a9a536a7c4109ffb9bd1e1ab3ea36555c2522f1cfad903c8a51e91cdff895146b56b83fff4680123b35a193c106e845f575c9b983e338793bddd57a0c46acd9298508e556d242d62cdb45e9c0f9bbdcce45a259ae0ffd57dfeaf85c64351e0cf392c4220a6d10c7e178ef8a88c4c1ad63c131cd92df268301730bcfc01f14882e51e9826b793fdfdf5f14ce7c44c59ed399e3a56ab3ede222dccd25736b85ffbf267efd69be2ad7e07a9b6360dcfee822e70f188722d0443239533c664b51d9d6bf46ccf8087116d5baf8dd6e0077800d84c309d7d749851f45d5f843cc369c00fadee5971af41f9451fdcb24138a1f19b9d3f166d6af9a4ac580b8b38c3ae8f0822640222d3563c611071c5ed0d370566ba597913dc6beed7470d7530b1b8ed213a3e6f37b15983e63f61de57cf0996250af0cb47c8c2cbe374678edd248d14f970fbe3c24a0a35a08b517af001b7fcf8cd9a01a4e909a1247600880a0db14025908498233325773bc70c907bffe93a537d60ef9590641987f23e28bf77550609aba6d5e1b13e79b1990ac9ab8b70e96ccf1c7d685606ea0194b40c68e3fcd64b3da521b770052221807de6c4186166a9d7efed120c978fcdb8380d5be361fcb52b5728831d367f29a8879a61d7eab88a95265b583c44068374cd3f26c23a1c62cf33b8f647c9891733ac9428d675510a6c9dfe5b0489c446a8601bd14bff6f637cb030b4dc60f8b17af638ac775a9339d7a4334cee79d830d735d3186adbc52e733f3fb410d20764d418f3863ed2acc874ca4be1aa47df5c24692638d703df3dfa0c7e7a1f3e9993b8f0e7607b4969532a97dcfd30531b19fc76c331b676881217067428c1403fce556557baeeb389b4146fa043d49680239df3182fa576d48c9d40492c78d029d149f1 + 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark{restore}if +%%EndResource +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 199.44 C +ski{/Helvetica fcd /Helvetica-ISO8859-1 fdf}if +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<526564756374696f6e206f66206e6574776f726b2074726166666963> 146.88 198.48 C +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 242.40 C +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<46617374657220726573706f6e73652074696d6573> 146.88 241.44 C +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 285.12 C +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<4c6f61642062616c616e63696e67> 146.88 284.16 C +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 327.84 C +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<52656c65617365206f6620726573736f757263657320626f756e6420746f2065787465726e616c2064617461206c6f6f6b7570> 146.88 326.88 C +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 370.80 C +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<4f7267616e697a6174696f6e2d73706563696669632061636365737320706f6c6963696573> 146.88 369.84 C +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 413.52 C +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<436f72706f72617465204964656e74697479> 146.88 412.56 C +gr +%%PageTrailer +rs +%%BoundingBox: 18 18 555 759 +showpage +%%BeginSetup +%%BeginFeature: *PageRegion A4 + a4 +%%EndFeature +%%EndSetup +%%Page: 9 9 +%%BeginPageSetup +/#copies 1 def +sv +90 rotate +1.00 -1.00 sl +18.96 18.00 tl +%%EndPageSetup +%%BoundingBox: (atend) +gs +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.72 537.84 t 66.72 25.20 lo 66.72 25.20 lo 66.72 537.84 lo 66.72 537.84 lo eofill st gr +gs np 66.72 537.84 t 66.72 25.20 lo 68.64 25.20 lo 68.64 537.84 lo 66.72 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.122 0.122 0.122 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 68.64 537.84 t 68.64 25.20 lo 70.80 25.20 lo 70.80 537.84 lo 68.64 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.247 0.247 0.247 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 70.80 537.84 t 70.80 25.20 lo 72.96 25.20 lo 72.96 537.84 lo 70.80 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.373 0.373 0.373 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 72.96 537.84 t 72.96 25.20 lo 75.12 25.20 lo 75.12 537.84 lo 72.96 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.498 0.498 0.498 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 75.12 537.84 t 75.12 25.20 lo 77.28 25.20 lo 77.28 537.84 lo 75.12 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.624 0.624 0.624 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 77.28 537.84 t 77.28 25.20 lo 79.44 25.20 lo 79.44 537.84 lo 77.28 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.749 0.749 0.749 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 79.44 537.84 t 79.44 25.20 lo 81.60 25.20 lo 81.60 537.84 lo 79.44 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 98.88 lo 66.96 98.88 lo 66.96 98.88 lo eofill st gr +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 100.80 lo 66.96 100.80 lo 66.96 98.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.110 0.110 0.110 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 100.80 t 741.60 100.80 lo 741.60 102.72 lo 66.96 102.72 lo 66.96 100.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.220 0.220 0.220 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 102.72 t 741.60 102.72 lo 741.60 104.88 lo 66.96 104.88 lo 66.96 102.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.333 0.333 0.333 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 104.88 t 741.60 104.88 lo 741.60 106.80 lo 66.96 106.80 lo 66.96 104.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.443 0.443 0.443 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 106.80 t 741.60 106.80 lo 741.60 108.72 lo 66.96 108.72 lo 66.96 106.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.553 0.553 0.553 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 108.72 t 741.60 108.72 lo 741.60 110.88 lo 66.96 110.88 lo 66.96 108.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.667 0.667 0.667 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 110.88 t 741.60 110.88 lo 741.60 112.80 lo 66.96 112.80 lo 66.96 110.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.776 0.776 0.776 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 112.80 t 741.60 112.80 lo 741.60 114.96 lo 66.96 114.96 lo 66.96 112.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 494.64 lo 94.08 494.64 lo 94.08 494.64 lo eofill st gr +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 496.56 lo 94.08 496.56 lo 94.08 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 496.56 t 395.52 496.56 lo 395.52 498.72 lo 94.08 498.72 lo 94.08 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 498.72 t 395.52 498.72 lo 395.52 500.64 lo 94.08 500.64 lo 94.08 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 500.64 t 395.52 500.64 lo 395.52 502.80 lo 94.08 502.80 lo 94.08 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 502.80 t 395.52 502.80 lo 395.52 504.72 lo 94.08 504.72 lo 94.08 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 504.72 t 395.52 504.72 lo 395.52 506.88 lo 94.08 506.88 lo 94.08 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 506.88 t 395.52 506.88 lo 395.52 509.04 lo 94.08 509.04 lo 94.08 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 509.04 t 395.52 509.04 lo 395.52 510.96 lo 94.08 510.96 lo 94.08 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 510.96 t 395.52 510.96 lo 395.52 513.12 lo 94.08 513.12 lo 94.08 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 513.12 t 395.52 513.12 lo 395.52 515.04 lo 94.08 515.04 lo 94.08 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 130.08 497.04 t 130.08 513.12 lo 360.00 513.12 lo 360.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Times-Roman fcd /Times-Roman-ISO8859-1 fdf}if +/Times-Roman-ISO8859-1 ff [13.68 0 0 -13.68 0 0] mf sf +<4b757274205370616e6965722c205a44562c20556e69766572736974e4742054fc62696e67656e> 130.08 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 494.64 lo 411.60 494.64 lo 411.60 494.64 lo eofill st gr +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 496.56 lo 411.60 496.56 lo 411.60 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 496.56 t 571.92 496.56 lo 571.92 498.72 lo 411.60 498.72 lo 411.60 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 498.72 t 571.92 498.72 lo 571.92 500.64 lo 411.60 500.64 lo 411.60 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 500.64 t 571.92 500.64 lo 571.92 502.80 lo 411.60 502.80 lo 411.60 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 502.80 t 571.92 502.80 lo 571.92 504.72 lo 411.60 504.72 lo 411.60 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 504.72 t 571.92 504.72 lo 571.92 506.88 lo 411.60 506.88 lo 411.60 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 506.88 t 571.92 506.88 lo 571.92 509.04 lo 411.60 509.04 lo 411.60 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 509.04 t 571.92 509.04 lo 571.92 510.96 lo 411.60 510.96 lo 411.60 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 510.96 t 571.92 510.96 lo 571.92 513.12 lo 411.60 513.12 lo 411.60 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 513.12 t 571.92 513.12 lo 571.92 515.04 lo 411.60 515.04 lo 411.60 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 456.00 497.04 t 456.00 513.12 lo 528.00 513.12 lo 528.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<31382d30312d31393939> 456.00 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 494.64 lo 585.84 494.64 lo 585.84 494.64 lo eofill st gr +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 496.56 lo 585.84 496.56 lo 585.84 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 496.56 t 740.16 496.56 lo 740.16 498.72 lo 585.84 498.72 lo 585.84 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 498.72 t 740.16 498.72 lo 740.16 500.64 lo 585.84 500.64 lo 585.84 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 500.64 t 740.16 500.64 lo 740.16 502.80 lo 585.84 502.80 lo 585.84 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 502.80 t 740.16 502.80 lo 740.16 504.72 lo 585.84 504.72 lo 585.84 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 504.72 t 740.16 504.72 lo 740.16 506.88 lo 585.84 506.88 lo 585.84 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 506.88 t 740.16 506.88 lo 740.16 509.04 lo 585.84 509.04 lo 585.84 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 509.04 t 740.16 509.04 lo 740.16 510.96 lo 585.84 510.96 lo 585.84 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 510.96 t 740.16 510.96 lo 740.16 513.12 lo 585.84 513.12 lo 585.84 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 513.12 t 740.16 513.12 lo 740.16 515.04 lo 585.84 515.04 lo 585.84 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 659.52 497.04 t 659.52 513.12 lo 666.96 513.12 lo 666.96 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<39> 659.52 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 46.80 t 107.04 80.88 lo 741.84 80.88 lo 741.84 46.80 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica-BoldOblique fcd /Helvetica-BoldOblique-ISO8859-1 fdf}if +/Helvetica-BoldOblique-ISO8859-1 ff [28.08 0 0 -28.08 0 0] mf sf +<536f7274696e6720616e6420446973706c6179696e6720456e7472696573> 219.84 73.92 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 131.28 t 107.04 417.12 lo 741.84 417.12 lo 741.84 131.28 lo +cp clip np +0.000 0.000 0.000 RGB +%%BeginResource: font StarBats +%!PS-AdobeFont-1.0: StarBats 001.000 %%CreationDate: 09.09.98 at 15:50 %%VMusage: 1024 36745 % Generated by Fontographer 4.1 % \(c\) Copyright 1998 Star Division GmbH % ADL: 917 200 0 %%EndComments FontDirectory/StarBats known{/StarBats findfont dup/UniqueID known{dup /UniqueID get 4092170 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 20 dict begin /FontInfo 16 dict dup begin /version (001.000) readonly def /FullName (StarBats) readonly def /FamilyName (StarBats) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -133 def /UnderlineThickness 20 def /Notice (\(c\) Copyright 1998 Star Division GmbH) readonly def /em 1000 def /ascent 917 def /descent 200 def end readonly def /FontName /StarBats def /Encoding 256 array dup 0/.notdef put dup 1/.notdef put dup 2/.notdef put dup 3/glyph140 put dup 4/glyph141 put dup 5/ch5 put dup 6/ch6 put dup 7/.notdef put dup 8/.notdef put dup 9/.notdef put dup 10/.notdef put dup 11/.notdef put dup 12/.notdef put dup 13/.notdef put dup 14/.notdef put dup 15/.notdef put dup 16/.notdef put dup 17/.notdef put dup 18/.notdef put dup 19/.notdef put dup 20/.notdef put dup 21/.notdef put dup 22/.notdef put dup 23/.notdef put dup 24/.notdef put dup 25/.notdef put dup 26/.notdef put dup 27/.notdef put dup 28/.notdef put dup 29/.notdef put dup 30/.notdef put dup 31/.notdef put dup 32/space put dup 33/exclam put dup 34/quotedbl put dup 35/numbersign put dup 36/dollar put dup 37/percent put dup 38/ampersand put dup 39/quotesingle put dup 40/parenleft put dup 41/parenright put dup 42/asterisk put dup 43/plus put dup 44/comma put dup 45/hyphen put dup 46/period put dup 47/slash put dup 48/zero put dup 49/one put dup 50/two put dup 51/three put dup 52/four put dup 53/five put dup 54/six put dup 55/seven put dup 56/eight put dup 57/nine put dup 58/colon put dup 59/semicolon put dup 60/less put dup 61/equal put dup 62/greater put dup 63/question put dup 64/at put dup 65/A put dup 66/B put dup 67/C put dup 68/D put dup 69/E put dup 70/F put dup 71/G put dup 72/H put dup 73/I put dup 74/J put dup 75/K put dup 76/L put dup 77/M put dup 78/N put dup 79/O put dup 80/P put dup 81/Q put dup 82/R put dup 83/S put dup 84/T put dup 85/U put dup 86/V put dup 87/W put dup 88/X put dup 89/Y put dup 90/Z put dup 91/bracketleft put dup 92/backslash put dup 93/bracketright put dup 94/asciicircum put dup 95/underscore put dup 96/grave put dup 97/a put dup 98/b put dup 99/c put dup 100/d put dup 101/e put dup 102/f put dup 103/g put dup 104/h put dup 105/i put dup 106/j put dup 107/k put dup 108/l put dup 109/m put dup 110/n put dup 111/o put dup 112/p put dup 113/q put dup 114/r put dup 115/s put dup 116/t put dup 117/u put dup 118/v put dup 119/w put dup 120/x put dup 121/y put dup 122/z put dup 123/braceleft put dup 124/bar put dup 125/braceright put dup 126/asciitilde put dup 127/.notdef put dup 128/Euro put dup 129/.notdef put dup 130/quotesinglbase put dup 131/florin put dup 132/quotedblbase put dup 133/ellipsis put dup 134/.notdef put dup 135/daggerdbl put dup 136/circumflex put dup 137/perthousand put dup 138/Scaron put dup 139/guilsinglleft put dup 140/OE put dup 141/.notdef put dup 142/.notdef put dup 143/.notdef put dup 144/.notdef put dup 145/quoteleft put dup 146/quoteright put dup 147/quotedblleft put dup 148/quotedblright put dup 149/bullet put dup 150/endash put dup 151/emdash put dup 152/.notdef put dup 153/trademark put dup 154/scaron put dup 155/guilsinglright put dup 156/oe put dup 157/.notdef put dup 158/.notdef put dup 159/.notdef put dup 160/.notdef put dup 161/exclamdown put dup 162/cent put dup 163/sterling put dup 164/currency put dup 165/yen put dup 166/brokenbar put dup 167/section put dup 168/dieresis put dup 169/copyright put dup 170/ordfeminine put dup 171/guillemotleft put dup 172/Tom put dup 173/Pete put dup 174/registered put dup 175/macron put dup 176/degree put dup 177/plusminus put dup 178/twosuperior put dup 179/threesuperior put dup 180/acute put dup 181/mu1 put dup 182/paragraph put dup 183/middot put dup 184/cedilla put dup 185/onesuperior put dup 186/ordmasculine put dup 187/guillemotright put dup 188/onequarter put dup 189/onehalf put dup 190/threequarters put dup 191/questiondown put dup 192/Agrave put dup 193/Aacute put dup 194/Acircumflex put dup 195/Atilde put dup 196/Adieresis put dup 197/Aring put dup 198/AE put dup 199/Ccedilla put dup 200/STARling put dup 201/Idee put dup 202/nbspace put dup 203/Edieresis put dup 204/Igrave put dup 205/Iacute put dup 206/Icircumflex put dup 207/Idieresis put dup 208/Eth put dup 209/Ntilde put dup 210/Ograve put dup 211/Oacute put dup 212/Ocircumflex put dup 213/Otilde put dup 214/Odieresis put dup 215/multiply put dup 216/Oslash put dup 217/Ugrave put dup 218/Uacute put dup 219/Ucircumflex put dup 220/Udieresis put dup 221/Yacute put dup 222/Thorn put dup 223/germandbls put dup 224/agrave put dup 225/aacute put dup 226/acircumflex put dup 227/atilde put dup 228/adieresis put dup 229/aring put dup 230/ae put dup 231/ccedilla put dup 232/egrave put dup 233/eacute put dup 234/ecircumflex put dup 235/edieresis put dup 236/igrave put dup 237/iacute put dup 238/icircumflex put dup 239/idieresis put dup 240/eth put dup 241/ntilde put dup 242/ograve put dup 243/oacute put dup 244/ocircumflex put dup 245/otilde put dup 246/odieresis put dup 247/divide put dup 248/oslash put dup 249/ugrave put dup 250/uacute put dup 251/ucircumflex put dup 252/udieresis put dup 253/yacute put dup 254/thorn put dup 255/uni20AC put readonly def /PaintType 0 def /FontType 1 def /StrokeWidth 0 def /FontMatrix[0.001 0 0 0.001 0 0]readonly def /UniqueID 4092170 def /FontBBox{-12 -210 1083 917}readonly def currentdict end currentfile eexec +d8061d93a824650eefe2785f13cd28a8a226cfb0a1a9915b91e00d2c2cb80ac548a1ab21bed4518a56748942842eff6121b01bc269e7837046266cb27dafd3a4fd0344e68245aa98a5f1b5bc9db554ebffb879f1c082989cf6c044b76f4814df51dcd03f9e3397f3c73d94f85771983bd52fbe6ecbcd9a2cbb7b3636cfb819daa5469925fc89a188732d68c6d06c906d183cb4bd495aed0c41fe6b7333ad90a1674478062c8996476573a0cdad62593c86e4741ecab7b8c75a6bf02971dfdc2c5a2e1c8f74ab1e91315c54e72426da3a62dede611d5967201fe8bfaa5a21c612c0b245fa35c6706b7b9aa3f73ce16604e3109770d367fb30fa663aa8d2b246de733d27174a0b818d54c58c3676435d43949eb9e5e335396296bc3f096fc154616c0b723b0b4a100ed45072f371f77f26e02f1dcc41376638097d79af0a4ddbfc37dd6cb60d0d34ea5a7536c655d95549b8a5a269e7e927c3d89f74b88e17973c2e8d64688089d329abe6b1009c0334d57a6dc34f22efdd933023231fa03fc81093ef255a199448f17d8f67dbc57c38b2fa163b8cef97a6f42e74af55319eb81a6fb9de18810ba9e3659a7144b80aa066a9f386de3030fc4985efffd13c0cab7049a09a71dc1dfa21a1540f4289b13dde08c0d3b4a01fd2bcb4e256b398c94036935bc270713a24c51042bac575ed4827e17e5dc2997753fcee0ecaaca582c85518edc0c3dee2851fa4d2581f7b399f07013ca3d1d4702cc27be134cfa8aa1cbfecac76f1b406b5b3126c3b7b60ec34340aac6433997656b3dcc1af6c8036f051edfc109a493243546721683fe5c0e48790848079c74ea0640c3f9c92cdd22fab8af9b5575a5d1d2cea0f1f715505cb02a1e200cbe4ea5563d0475cb13bda929286f9c11eab10ddd676314996954ae3c94bd14f364d5202e6ddd20b1b4c7abec1c061b2d8a1776577387a2f2dc424f56d44e58b96f91f7b871627089498d76bbc6664e1ebc9b26486cb727d4a5d62fe405324ceb0a5dbf51c9619f2913e4dcea44c5bac49d74bd049f28b83955e13f0fc77d998a307b0bb560757b21e4a982b59cd5723d66952b8a7ad0311ee6874842f454046538c475b86983b4b8d9c00e814009235a058f6d5fca9e8339555518ba2b64ee925cf0944deff5c14069a1ee1de2cadafaa6421f495c21c042690b3a7c9e6a5a137ee005240308e63e0b1d4bead90ec607d19c57ecc24c2ea9b8ed4af8e5ec19575ba230c19156ff9b23915a7b50666ec4b655a2946f97c5013cdfc31825f2c1040fb28bb8876b1accb1fc005010e5e5d061651dc9df17b7bb37c495a37df9659962680951290f3f4168dffb294f83b2a3c423526a97451e2504fc0c819f4d263834ef7c8588ea4d68c98eb5e3ee3c2de20a6da219b3256400a7c745059581d33158a505d5bb07c75bda324c2d8fe34eadb98520c7b82838835e92ddd1d89516478cb1ca795324f802e1f7a5547f671588fc3e5b909f5ab9d573bb0766569a36e89586b7410b76867cad6577022e9be567d1a5578361d83b817fb994758c679fcfd6b22c9fa7c6c76f2a72be566e42167247c831f826d9a10e03874b9747783adece88750be1206a07923cd9fe06b677b61c69a7dd9e0f9dc60771ac529f6adaeee9ee6652cdeca5789c7f242266d86f0154a1984402c720adbc3dc79b6eece6d378555d78873844ba1cf057f385e70474132e0bdfabe169a631e07d12fd21f18736013499081e58d72e9cd451df304a5bf52c1f1723a5ec8b7992d8fa3f33d5be97d4c114fd435a94607f8be09812bc1fa4db028644e2fcef5d86ffb947a14993a93185b054a7cd9ad734c62f2d9ce3c0f9e2e8678bae5b92315f60169aa85d4ae22488cfab72b841374ac3f39966b9e126ad64c0307b54085b6e25d51caef51fecae4c5ddbfb5c29b15cc90ec0795123a84d3c31173b49096d617707d9e192da82493ac9884759115c02ba4686ed464d523aad69167e24e5303ac3eb3da0eebcc420fdc256cc26d466f979c8e637344958f02ba9d3a481693fbf13283d7d276af546abf2f2bb4e6c6f835c97e532bd5b40e8b08eea4441e8a9e03021add36c4fe28180ea466082e4fd7facb03f7abd47c929c4e0d84132835e59f8276ac7fddec7755cba924dd1c97e02691f13f2e159b1e358ef2ba347e2298b0b39f5ffdab57daae22d94ba5064abf716c866b64add8e3981b76a77a3a8be0a462594b9e1257e7940b237875e000c0e23a0841a85da6eb5af931dc0ddfe912285d160f12a66ebc8717fd37c13d20cc132218d31680d596ffbbb2f2805fd931c61693bcbe365f0d19c8fea4ff3eceefe09c5e29b7fde3782b8adf4bb1aa7f89ce01fa59d1322a1ccc4d92705e274bdc287312b23ab830968143efe12c8d4ac45e0c72c11f630eb5ae0c835b7f7d32cf261c20f04b7df8e362cb15cf38c531a3988afc8eb957fcee0364049ccc8d8a6935200970293486bb69db1969a2aeb39829cc4bed803e0c266c77b0dffd349ff9ae8f95558a3977775b1bc2dba5be54800a9e9645155315b062d0b5a0491cf90a66e84b581070f30d5796f71e88db0352432e8df588d25c9c9b2dd12b976618551d5625e357737966d9a15fe3cd9d54bc275b6f5993ecfcfbb373c419e2f8ed32fcd56d30db1345987a445ad259e03053244a1ff80c9343538c74845a907b0480f013289cf475df6c989a81aa5ba904a63db328292553fd4fc3a783fb76ee6ae50be4809ea0aaac9a9ba429c9990eb45affca8587972c54fdd677cd14f81404c77e4358212f44826316a927983c968767e7be1c7a36f308b6cab1648780b4f1a568cbb0ea49f6a6352d6ab18d54d442c176037ad16e18a17d88cd8fda7e86895c89368239f0f75f8c26f850316a328c40efcf316d8829ddb0fb69b250e41b94144e0475acadf63e51f27f6ecb6af4ed78ddce68c055b7a1f78ec1174bf9d67f54838da11655980a909ae1b80a2e6282137c75e49d703e6d5b4be616e62b020a8d08efd14912337a75857920f1d3515ab2771d38d8d8f610c9801d0b0c8d3388c75d211ac4e4c0c491d3b70e1bf1b926a6fabf60487613e76e6f779c4aed60929561ed06c676de7d5052f60db62e446ca4e2775b966f74a2ab55466ecac93c65e48d5e6b88080f24534ca63dd1e6781920be3010f3e9ceb771c5509754ebf963de75b4b9c9116ba7f4e21d9d89d2df167d8c5674b2fa61f49f016b4269e602c6e144de4a382fb7f185dcd82942081d6362f335695587d2ed1071a70bb27d51200a1de03763bec6b2c7a86d8f200505c07f25fc6be9c044110607154cb69efcbfce495dc86dc634e20349712d3754ce99a8b33cc59ce272e39f481b729c878399e51976652b4a525d107ebbd809909ec95f07f2012672601eb9ada5e0b3292d68b6ff8d529a2dcd23f7150d77ba5b1a36701d5954d37ee96501f9efa8e037290f6dca8c024ec0a2ced95b8dcbfea0ddc55dac8ffa55e224d33fdae74502f8f0085fdb5d6d031d34a609db4ed63ceeb285f3697049800bd560e31bfdc6862a49da0ff4b4e84bac9f184e08181c7870058559f826977e851f7dde09163b8b3cc82be8103f7baea3072202ffce888f1bbe37cadb748e2a3b3b53cf38b4336a4eadd0afffd76389b1dd9d067888c4e647b07a7643b81fc08a15872f08f6295eb45e7838021253432f2bdfca6c2a85aa70efea06863d3ebfdc555f41abceb6fc1a5f92448e917ae97706dc04adf0b7bc817c1b93d2f924b118fac5fe6053093401a4676c6d7ce7b4ceae1f5c149b1d8d712d32d56bc8430c210a7124e192e387ed9696df38ac2763e3a065c3ae4726afe9c16b07891bf5243c16add2bf494f9ae8b7566d4ee600a7fcc945d4bdd305daf4df51b1c0222e5594c65af003b51549e0e790ef194943d4accef39419ba173d05788ff822d4e3d4fb5a612fb13292aa377e50a44a6953bb793d0c521c2179012a882b74ece2f79723fb75624ae9c446ba358a3effd738ccb59a856f1bb5afe8635e1033936d58da18ea1f7464758e4647ac03552bcd1be22ef9d4c0f4aea0d7d1c91234ac50d5192bda73b0e63a8303ee284009e6f42c0a8671cbac1c02ac67f096cdb67e83a8d3a8b0e2915fe4e498d50a80892a374cf637cbdc145c2a4a16e0449fd300f7f03b9c80b320addb404d3b7388e5473a6502c74a9d614b21f2526b2e4f9fd9c5adca0f01677b57de5a55d60d9c428c6833d7abb14514926e09bba6b07763aad75d0a934b7c44976be43c289fb238aeff7556183515a5c4b085447922adff5498d29e101a60ff02e893ce8fb8d446874914eb3d3009db46a579d14dfe884d22d9ca5bfde436f4bf334c8c8e73cad66d26b9b711b3a2a3ea84d6864945e529bf59d397ed0acca03a3bb32e470c46cd6639cdae83b4e8e6decd2e8574e1b9361e2600bdccd6c9231ddb2b5981f4148984e0d21d2bc7c54fa7b32144192d32a60bb17520e855b14ea6ba31068d4e209a5add8dd6cec44932063adac2280f985cc70099a1fffb3cdc3134604bb8e50ede70ce9db412a309a21a0541662050f545cf6f2fbb39e9106e83d34dd1a7f9f08b66e68052482a68778687aac8b793ca24cf3d258d7991c4d2c0eb760d1b83dec08277bce87bef9883ff7af63a927a509eb44ffdf2f8f2a529baee6c68478a1f8a10c81fc3fe0a88004843f05d15b34d04149508d7b29ff2b11ad5e150269dd78545f0f57ca1752f6197a8539ab3aef587645b5dda3dbf18060d30c3426f2fff04d9bf22f1591762597d72cd6225f01377293696235f084801440fb9590bf6468e73c11d7de5c7c9899d6a84a9bbe18c8238e117ae4e74ce9c087957935630399f186f4712caa2775ee026f1c9f334bfa2ea897f2cef8f6d2f200bb2fd7d9292c056149cb3091d54be657c5efb690dd7290b7f866330d8b64cdb134019ba3c608bebca348fac2ee3891d54ce18d427de0e8270ca0b19b5cb9ab69ff7bfce6b5c6431fc794f1a2ae04975dfca6d865e38a85d0092b339119f43ee8f11f999ff0132145ef65f2786d9dae9c45dff0ff2195bfc604db64e4da4b681dcb6a3e2be4f691bad02abb6347e7ffb00172df452182679d10029a878d14569825c6df61c229e158f92a6a0e0590722313729ecc3c93a9de9f044e62d3abdf500ea46557e90649aeb8cc582bfb6fa71042b330800d50aebe27e1b7605c3aca1f67c4116d93a1d59d7f9a9d7dacb2c949193b0e901291474ed0f6b746c680b337ccc6adcccddfee2ba9e31f588940931c6d697222b14220ece34f97d640f78eafe33d689d8c5e94ba3eaccb197728d58924f1325c5951246898b2477057915ce4caea524151e7f3cb049441ae88014b89fe7730eed66c4161b2e01d608d977d674edd37527433214b40081ec8a262da3f69f07dd54acc3a8dc5058a927bf7ac5d3ff18e0e526cda9eeacc331cfecac11d2bec5872fdd5cff5f7459a42f263304294b139fd7106149b962873b757a2db3ee8e030a8ea3af3366fa5f3226d9f9de3c48dcc0f701ac74385d2b753e655804a834456e17ee576872bb5e9815bd6ab6a4555ce5fdcfd0b1637357424813dfa6443a46200dbcd46f7a15d342c14e5b99c1e53953283d83e81311eb2537162005d2bc0f18b336e33f7190d4cc4ab8a86f596ac2522b6fe3aec0befaf024e35f811a309c8a03734e432ac4695d977d6fc14c93773edfe0eab4b5a0a6d55b4ccd205086b92107a434b119d15f145d0f3511f823e69a4b3777b659555f06116cd99075982c200e36eff85d7931c7b918af5504bb4129cf65c8a33964b3b6fd3b2340fd3737c73f7667632cbf81535b88096e99a5e98ffee00409948eb2b46010a275ffdf345bc0e359ae4c2b6b804a36ec5018db1ddfd43ed28e0982be3dd61a41fc78221bfaf4eea3c94e8819e2d296a355bf61cc29ad69e2baa9caa77f4587be6bccfb178d553bb99bdf52716e6a8e2626505b819cc595f5173d13340fde8dbb4db3313a66348c8cf5fddfe7d7fd04becc8fec0ee1385ce5329088e772f1939fd59e2dce71c2946044fdcd131e06695ebfe5ae6e512640d0ea79492c20880391bffb1b3c9851cfba1b5b16d5860baa2a2b1f4e0a571aa3551cd73256e171c2590687e3596108defc56ca6cefb27095380b0bfff828d897c5f4a1f7710cc1fbe37ce9254c27edb772093e789a7e2a941d676fa8f14edf641dcb06fbd638e74a3764be77ccb7f93b5f961be59a6df0c5305b6ab3a20ead2d3eadd749fff40762a25833c9efbe377d2aae40b18e7785a77f9eb4f05f987ac7572854859f5fc5f56240e94305543baf5df3fb905a1122d20d09d7133923783f4d1e30ce9bc990e1d4989280cdcae75b5a78ff48ec68254373f9a57663255c0d5a18bc78b3cf2002befdf0cbb3cb5e76243b963e16ef7a34a06016dbd728117ed141ce213dae5acc96930ef9320938084dec3f77ee4e595b496648896de03deef6fcf49f6477a04a0b190fa668ecb8dec555db55d7ba7d0151042dd4f205e50f53ca706d93c9ae1b67b51989ad1b3ebb27f2416588397429d2129bfe0d5fbc7888fe0ca49754024224ba6fbd089214122d5c5dfacf7fe314c34581b80fe2f0786f7a70788a1dc27bce9f69daf04f197e9fe3f735a339f6f88067636e23559d1a02cd1d8b70fb07146532a5b404a4491d8650a22ed0f49088e86054e76656f079074ae121f5039c5a128109551c3ad7bfb874de16f639a82f0cae1ba1e26cb21bb8ab0ffd0fdda61da950d00e9a9d319c32757cceb80c07716cecf71f96dc167d760bcb54c8c41387d7fb8b5f884a0f7f53acced99690e1316a8f2005edcce538b3b511a637736a08c932fe9f54e281535c9ebe5716228cef9648813df7f0ce70b5107833eb4025e11f93aa574ca8215ce3dc6a5069f03f22a2224d9d2f8c819714b3b02f32066785f9aaf616afa69a3c031f1d1ece51d541f60d6b8e739b63b0f6472b93e5e34cbca3474b47deec1d72ddf91baaafa42078c177469e8099ef4a80758225c7839a0ba643dc3c88fb01ca0f278f077675f0f3bf3319931f129dbd9ef04dd0daa8cf8bc6573b6b2091b64326a366df67a739f27f8c20f47ea3bea9a9880b0aa3b558c56f6596b0f51b124b78b717336142cc03823f2d75c0ad84c09868cbd0dcfae4ccf37b345a26d5e08b20c36505447042ee2ce81f450a835d7e0b679c0c9eae37ef6982001a8c52708c5db0ec2294a90b9876eb789ab09af859a0a879cc27d2f52dde9e9a6960fca2530244cc26d3a21cb294458d707dbe2441460d79d1783fb334a3d144339bdd635b676a1b260f5969bf089d59a526f56bdcf92bbb2d52cb268ccca6c66e4ceefa57c72cbdf8a4e1a2b57ff356f8fa49db680fdbaa3d4df9f1d6201307a44a9ebef9ab8c893518d71beceba645d6df155f6aa68163f8d66b40c1084b673ac16b287f763d40db303c4c9f9e76a3e8fff77d595e97f7e59e56b02aa8f005d0c6830931892207e25a11520efbce320b99362de47e093fdd48318cef9458ab6b4093d1480ab1424e82695527412d0c5e3c299eac02b67ee503a9d04d31431d172f50666fa59e778dc43ffb7eb3f78324a5cd88601f7109bf3bc03f0256ec90473715c9a626a8488a4ac0403438c7fb97438334506f3718c262c6fb671cc1501e1616281c50c1f1abb0e796b5a989d9419e9146784619689562ee006255b58c5030d4deb7bd4e723d5dddced22c58905adb6a1b319ff10a8610912023c965c87e8b9f50babf746950ca2b356c1a9cc1cb8180a3536b2a639a147f65a8178fbe711c5fffb8fba62069c74e02ee7bb219bde7f581ed080e33ada55e37013823fbe5eaf8f7b774209a75b047e7626b8b82733f525e57792ca6c79bd882c5bfa323fc5ed98227c892ff958a359fcf654cb8facb6827d717a899ab9b4d2093e7a3762ba0c9f7ad55124173a5bb29f9f8769484f698dc8f8b394816dd74eff3b1a7dbdf16096bd0ad1b5bd409d56783b6d418631be43d241d6b834e1e8107bd9e296f9aa43e90ef753d6ad527875f230f6b1d3914692840fd51e8048ef5ecc8e7d2da90645c8e0acbdb3803d677cb07714a5fbaf0caa48234e6abfd0cc1be8a80ea7e956ec40a54ce712c979d9d108c28566d3c71c93c25fd7c202c637aa06f1baa00ed6262f87062cbc03e7722983a7c87645ad8d6e0df84112139cd220b03e3b874dea9b9705efa254db06927ab7951eb72ea84b253e0bb877b77fb1810b078ba9f20280d7e85fd9d134ee7166cb1cd51525a5bde7cf96b26569af11b40dbf5b4b25a662c9e14dc084cc349bf451cc976d1de3ef735d001c18d7e6027fdba88d29016ba395ab7f6b1d232151acca1ee234a287c2d7843223db3df6e3e5325a9fc82d92b0baa4a28fc927a3c3d307f7a7ca1ec7a54e8b4a56c177aedb633425bc7676a10c0c2d51b5555f4757c2c9908cf39eee8f85913216c5df40fc6a04dc460e99f55844700b4e02ef7a81ddf4bfa798e5ea327d2c66db67c608afb6ea5753ade25c620d52a5ff2c1d43385737d41e7e6cc645b1f9dffacdc0e8cf72a9128abd66cfe77f2c273e7efb2c6d3ddf4848a023911b7287797cb7a3baff8df5f4d8baf2d30d8ef3daa330fe4728f2fc405bf82b6360d1c9f78d17fe13bad721756ec2bba578702ab8a41c094b22a2ea393e9d4d597e5d0c2f12ab5f21d4546ac61e0b96ad5bc47586bd42edd8caf964cd2b997e0bd816ffd593d5481a8ab543384f8090d7cc0d9d4dba9001992366bbd61949f2b33bb6633f45554e879ec6399f11a13be5d195c927f9e4fb503c2f7f1af69725add00166a3c6f0b72230416d09687ac6109eb06d16b8321ab293cc112cccae7bd8233a6206b814694eb0057b708a76f7c793115dbd09b6b6808cddd0dccbc2a20c5abd02a91f0846ac0856a5cf7be1319057e48631937a3bfff2d24f0fecb55e929c1c7d8dfddf2fb892926e20c9fe4a84bc1d9dfd203d438a7f989ba23836bd55b1089bcaadbbbf19e8cf001f75059a1dc3daace5ef08b0b55231f3b63ccbcb50805601c86e10e48f90dbae123b55d421df8301a9c67f4cdead045d1ace302b93f9337ada9ed3ea36369cf35577e868383d69cd425ece04e0cdc1940b296c35e1314d837d6fa900d661eed125ada136ae005179a03494e23a245d96e60cbd7a04f9503c227e835e58935e28bdba5446128f0db08dcd9b85049c5c67e357a3a511f37a71df23c25f971df40b9982b1b5ab845bd4870fbcdf4ea319afa2e225dcbe3b4b06b73429467ab402aeb48e3b661a0355cdeefdb754d43b66d1b576a1ec93994587b16fef1d493d53263ba10fae3dd01736b479e33dcf87dd9af58b353bc55b8a5382aff065773ca8e932d8e55a80537dc04193176a1c38082e3d4fbc38ffbac68bfcbd80ea1682b79961ca070d3f7938571303267b2be5afc70f196383a01fabd8952db19f7c5921fd66ef6f44523adb1bb09ed0cd03c14b8fa91b088ecc5152d6e288f2f388b5870733b489081581fcdc2e1483d3a2dd9b1bfabe1732b2ae37041d49727a2bde007820f328cc2118b610793e6a6996e1f336a061eef6b61120049fd0b9f0847409cb3a8ab404c563c1769de2660b073dcb30bb916f3679b5819958ce2f5330634e2361cff5c0915861ec791b0dedf34a845103f7e1041a366e6109b88bcdfea2e0d0d260f16717d67e20c9a0b624f15f1f05339a408dbc7fa3b8395895bf50691bbeaccbfe69bc22e136a37fb9d074d668eaaa2f98af8ee35119d46af0dd9939462cfd2ddeb85792ca7d38d61e2c5109d2c91fc8232503900396ae6a85b7a88c80136699e77c0d7408eb88538cc544a3db250e2bcccbfa8076d70b026d46cefa250c128f8ab95d1ed9f028d56b01489d81da013201747b80513f318b84fca9dd1c4d65f36a82d09d847d550e1854341338456714e0a93424e6146e34994f84cc6bee325ae41d716920dcc0bfec62368546c901a8d43bf94c9bd2cb56283888ca54b758135fbff776c9fa98d50271b172889414b7e948180c03700d2cf3ebf390f0f9c8985900a76be9171f7439c60e18a0db5a46983722ff1489f77d24f2112b9035e65cfd10fe4c560426e464b6759ae5f24116d16f9a3167eadd85389114535f44f8054d463c1b8bab08779d40b74ee854aa6d652aaf40c30d63622eda14aacdbc002c0891abcc764b676a3b049deaf49d6789c7f9cb12bb6f0d1619548bc12b6df69c98a4af5b085c76966b116d6a2cffe4a00733efe59a473985d5602319fab0f04dc3a55be53e9c87726d6ace09dd8343e3e111858a3ae45b35de08b1730fc628265f0afcd3924b9c143450128aaf68f41fd5bd4aedfaa9411bd33032a81405dc45005c62b682112ce0952e1926a47571a8790d639580797e33f991aa9c0b7178448591f044dc794e31acd413e6ec84b3ec0ac0df66e08e9a89727f91620f3f18f9238ada2abf4557d72553f01bebdf62bdf5742d25b47def93114918c643aa2bf8761441ba5e6699760f9370b5c29545606f6003e4c6e4725dbe4078b416022b20c1d2aa30d0dcbb724783777fcae6d2487bb793e9435218f93573064f47408d08a9c39bc44caa91c24177e8283e59cb9be2c46c5329b150478beed8c6e1e35bf56c3becbcadaef963bbc70128a1518c635420921fb37e2252910e270692e8bd641832740d67f2174ff3171ac73c23512bb0682a305899af28fce475f399ffcb310dd96cd469fbbb7629fbceccfc497fc2e469a14943fbd5c4d24c8c89b66f6638daa38cbf9dcb49dcf016d768acdf758356834503afa00b7f5c8116e147c5397c2aa8ec8a241bb2a5dcfd45627821a79dee1ad9b162796b53c59e3938c94a2a531b737b7d108b9f1f42a2164027e7d3922858aa7931dc0f7e0ec8e0fc30c27d4722a4d083115c916da5976680da42e3a7fdbcb8084abde4d1f95f62a2291847c4358cfe83b13b9ec2f1378f75f787b2b573a027b24e9eb8a47188be809666df8772e43672f910eeb1c23355987358a1bf34c3a88c2647a46eb85c1429e2e5123acfce3504e0ccf4b89e9b3de548e2bc16b8e765bb53568070a17b23aee93b0988b67e10dca6129f19083a22e950a6beaffbf958a232d2b40a7966f96d8d6c1d30d4e9d42ee28dbcf0bfde533a8b5c07c32c90c634bbb90471c53658d596fd066db06cf96e76f5563b2dbf17c284fb88a7e389b9340cb17c0707caee7791234d4b9cdc0406a59ad5aa3ebe06c7ac21851139171b188bbe7b43422e3847e30014dc2f4966126c2d23e1d54d0db34fb2f415347f14ccdb4f533d2f4ccfeae45f21b027cda966933daa5732464d7e125f32b05447fe1d15170654b53a5fc3ee1d2d8427096d1f71f2bfa3e240740c879ab752f0b14d1d17fd880f05d65ff64a05bc08f69d97fb63dd78346b9ca038d79764cabd013d57fb3506d4b0ccef1c92bbd704aaba9cb912e6034ec9ab77210531c9a1266c272ce3261dde19b9a574fe5a7a031416011100ef594396adaed9f884d18173f0fbf256e47d5c57a47864a3d592c2324c39bb6b9f8cd770e23e5884fbfc119eace855f4f21356a57f912c9e27fcd292534cf2ce0e0490aca08b4df6a3faa614239252279fd2c3df91e054129e1ba23fd9b7a90ed0cbc1f9f8790ebb11bec7b0b07a228054e1f8bb4241ab3a66bb6a224bafa455ebf835e5cc1b0f7701e2e64190091a577dd835afc77e72f3970721e1b6fd64ed65abe1b7376eb58e3273254b2da264df7a97286ac43f1c55f1b50710f54cf02da4023260084aa143dff539c5c7d5951767d0ca6b48d5ae8dcfd1727774ad1c5e7273c2aa5076c0a0fa3ff8f1bdd088fbfc17040808f3bbaa83a228b573694aa171d4fcdf13185e0a010788698eba537240a9ee729d7af975b4a8637901fa3aa401cee44a0940b4378ec67b101784d07fea844a50c542fe2a3e01bda791c2ba0ea9879bb298b7883e1b8ee13a88f9dd3b28813baed3f97c29bc8b9b2a0bdfd03df29f826498abe20f8bb7ef6be2930377c56430b7b0ffafa4193998c32fb12ab1ff63695a3201e227698fa8fcdb065c9c3a82d2f0b8a78ddc9afd5a1c5b135b019c22a46d8401559149293420d91aa98397741e9cf6bd30134bd8b5f3c5a1889e5cdb61aeb0f8a052417c5dcc3eda52fd90b2a8c2ade1a0cba31ccc88a78e1573f68ec6104fab6c417c631e90bb9ee10daba4cc047ce30b2eb735ec694521b7a87edf3e15fbacc941269090845894eacc56321d38ebd3bf3bdcffe80e3b21e4683736c81a61ced165e3a2fa10b969ddfa1f55d340612e7550144aa43868d2ce06491f2e5e089b1fb3880c17b6040343b795832e1638791ab2d12b1df0ae253aa1b3e9fe01bb06f7f306c7468bdb397cf4a9977caeb0a3c95adcceb5161f95c985b08d5d703bdd011d2d4a38f16795b54058fa2183ce076cff0762b3ebf56d8d8d0fafdd508449a2f5b0a8692eabfa509dcd0b38f09f4f99e56a0044c61c067a107857dac52e1a364ea053dcb290a7cc1c78420bf502fcd56c804c8729871aae4a4752eda8c1f78de3419afae90eccdc7572a00deb5e1a90d1b8676ac638f011b18cf42c99264d350b77a64a09c433a470f3a2ea988348f59abaa12a1384b0558890e955f1f385c05c740a0b44bb51e9cddd91bdc46c8804eca94cbf9e0fb0c18b770b70f81fe5c9c6554b3a781b22665de565d08fe0b3bf6a57943888d387c19c296827e60eb6b81685016bd1b1c8d95b29eb8c335fd76b208dbd5054b22e1fc0ab4743f7b95d623ca64c9f9afd5285978bc5635a54a70aa16e736372ed027e9518a4d0d0f9951996b210830e6d46ce43272dd0923483f986349321b2184555b6a6573bced5fc778d682085d1970f05cdbe85c936a4634c9821776b4ca2e8dbadf3715228a73c71aaa271ad02bdd76a00aca5bbd2036ef7bf949814e76561a22c2f2ebcc43c7f4af62f5a40e2df2ba612e77adaf6715e1c980aec44b1164ea20020dcb5d9fb7072052e733a0a5b69d175ba8cf48b780b371575e490571e05b3fbff92f1e0fb87abfb18f4f81c8838d5bb155942adcf8911fc3926a22d60bc9037d8eb026ea975c00937d79432be5e791ff1265b396443813020ad11f0e0ee66bcc4d68aca9ebc2b4b8aff28de824007d9d9d00a12ee894e55c565f957f5f0cff21e1219c0badbc99de37c17efaabbbdfa903ca892d5a99a7201813a2ca9cbf7b5d19d779c82af7a1be51cce30ff3820448d2e10b39154573358bb6376ce5413267f6de7d7cfcb8d4d9aeed7a0f6648834b1452c58f397ea28dba8cadd4ef29382d757b78649c6436aa3e38505e1543fad8d22a415f8c0b6afa7bf16cbe0aa85eb9042f0757c8f3ce4e0d432b2b0a328ab69529c5f8bf8da11b0b354858df07e4644aeda913eaec05fdc24b95f6f4307741897662f347ff5785bcb06c0aca0ea708cfee767f385962de34b05f897242256c1eaf5fd9382fa9f07c3b2acc2d0193cc7688fa71448b4374cc3805cec6e7b503a693be2438fb03037d7a70088dc9fe10ac37c84d29c8b5f04648bc23c998872af1df21a88cee43d52ab580248f6d11c0896d25c4ec8068afc138518f52a23c9c8ae8dfba103cc49368a2ba7a6111a8d0e154d007cecd32d9a71c3341ee238d7664d39a263ce2d5efefe4065c1654c4996e5eb10397d78ab6ad8155ab5c815707655d2a85a00187f8ed16ca19f0fbc8c116417420666e9edabb192cb81fc6e2a4fdf00bcbe0ab582a63de69af3d7e7c6ec7f23c09f02a81a221ca2d2edaa751bfd3949ecc3e81d6f518453b47911b0aa13ff53dd8a4af4b6d8f40cf4ed2f5c3e700749aa3211aab791b9e9e899b4e53f3cf1d1c62bbdc06ae2ac394be1a9694858919da321123184a8a07d01e084655b974e8ae6919709ffcc4826f62b6a5dd420b784eb881ae6e682b292d2e575a28eec33e21afe2fe17e024829ed46bb4babce2e65d97a656feae5f5bcd3f10312a5a102bac3e502a468c382349d47b6e7fc4435a8c56d61ca2c33d93ded9f2165c1f640cd23b0f36e64adfd4c5afcba0fe8cab87ba2040efc0c2f00d3fbab933303b1c34f15a60158e5ebf5c82ed18c84c54babe8e1e4910921d3cf829cad909acef813f174ea65802614fb567944b14630d1e4b063c49637e7110a2ca6de4f34935866b3ff0c3643014aba7f8ce5b2701abc1e0f9caa048e7d8fb937bff1c0319a1de8f126a16740d7f0a8833b60b56864f98ea428e2f105ceff6dd30a16bd24da9f75dea0f4ce864bd44bc52b73057527b73f35a7f9e7bfdde6435e68fdd781e82b69b22c09b139b35b5a47a385ecf05cbf2152cb5c686616f81585bafa01d067a5a086cee61113870dfa9bda1b2eb1975403b994e4669b30bd5354784b1c5126ea7313e3230fbab806e8cc7411149ac52029430ce0be92453dd7cb39026ef26451d2f230392670bdc181a0d0b24267d08861c5e5e0d00d85b84a0873c02f678f2522eb8bdb04c2624256e79396404f475be988e4ccdca00ff9c4aa86cc48ac5f05d2ff1ae536c5f576d719862d44049edeb7d25c2e78e328bff60bc1f09db639c10486d65a8da9638080ab92b3c9af7799a8149cc771857f3d36a495fd7e58236beccd8ecb68aa4fdd1f8b3fc21796e7327e0eb730e0cf78567e40a8c0842dc3a9f7451f347af2375ef47b560bf6f9cdc8e682ae9574b9d7c9cb4c764ee84a22303a35b49568d8dc89f74c0447b0f263ec71e4acc6de6e6116085b7edbb61ca4b198e2af4dba714c3fe6b9c821ca1880eb1b896b01d086e80a43ddc9619789c75ca44f8dc9d4013ed4d10c50976201e6f020d6993d42fc902b299000581b04d1db1a4c548a774fff638bccb298f45bd0a30ac11a107e6b9042c41634732855c7431610456d2d163129166cf90feb8df5a72ad9ca31a8613ca3df539f599996904716878028bd884b1a8d75fd0d3fcc6dd8e007f6f9761ba55a00fa6799b6a3ea67a6a55ff8843cfda811582ef1b553b27c05331aae09b5a46aab96566568153afaebb7b4ae5e71f7cfa6fe08aaa52aea18d1551068e25942f623c4b8e8a56f46e352cafe4885dcb1eb19c458580d2049ffd77af8380ff452acf5ab88fd52d7ef112c29ff6464e62465398fafd06ef81bd3fc2b4feecc6f45f0146c96d4a7c0f90e861a1d433c5deac14a019f50511d6ae9f363952c0ba815bbb3774c97c16038e82e39b76bd15f58f6c693a973d1cfcfdfd65ff61efd3d6ded93c3aef8a715097e97d24ddc94ba972fdd68c732e1a9001f3fcc1a71f1f9fcc1b98637899fdb949c281d858130712d5d5408f0208d62f5cd7f81dda2649edca15790c87cd4e24ba48a7ae328822f5a21e57f6fc5a6fcc71d532ca6817f6eea89f76b60e4fc7bd243c2d2163b46ec46ae4be40764f95d1a51efe6f6d8274b668c50cf1de75ca2b4791dbca7c9232d147d568cfeba0b44caf8154bd09fe8a55a8bf1bb1afa95226a827167b13f33b924ca637182b0bac8b56e03327986568016841bd25cfc769000a7c746b2d930d291ea94f371563b92535003c4bec0bea1b134915286a1665b643bd011015ef04ac9d5abd487c0c4d3c6b20a00646b476e518fc0b008960148a123365cb40be362b3b1694a8d5c05d23b018370f616496a52c2cd25021c3795baf897f812f62a5a5721ac8170e79b49cdf906bf71c83af3c445a82a9b0979506e7df0fff03405f717f51c69c995d11456b03cd8bf9395d33fbb127e4cf9d8fc8411a26d42617ff2d64e886ba9fe5c7d5b85b43fc4faf88e7b4eba7145234769d58d53a5c07d1468693b0f93bac6e2cf5a931b11506f556484824d227e448c0a3805f2217f136c1a7d56f3421588e286adec32d32422b95ce8fd81eda1c3e9beed20f03cbe487fdf2d65f59add2bce47cb5f225b2c6c09100225b4276d3cb5b6792be4b8f0489bb750f1188f371880930d79cca6b09b2e3f303f766081097bfbc5e538d3cd4ebf27befc9132225dd7428d444c764860a262e95221f0f1fe57f5ef3e4432d2be9b3c9954a88e58cb329ce9cd37f4fc8494ad1cef800a7bba8d2ce486f7ebd7a5bc9dc73458bda9e4c46c6297469cb8d4e3877ea8db014c04ebd313c6b1ab74abb69b03334d562422a6529b8e68f4262dd3ff05acf1c6d0074d35e4e977c665a26f86d6bae2c4d64114ecfb334c4d575adab7905729ecc6345e3726d7f2c361ab9d75de26315cfeeafcba9bff88c0ce812554b1c6ab0c5765c5618f1bd8dcde547b86af905406ea216e4eb454e59a835fd9648dc5c8c9da88d7a753a2516b50d93e7226868bd0c4c6c2eafa7a0696a8ac2f0f3e6958efc1e6504032b42962ba6eb3c5bf856cbc6bb090d481489c42a8e6d5721b6cc02b34d6650157752126de0cac4c31b7b073e2d6d546476682be55d764f5bb3154d70dfa9244a6fe5580db958e4a766f95a61987102d67707838b177d10d116ad56368c48e815b30fef5fd6554acfc0d9e64d3c4f6b8e9b8ef6af2e09c6126a92f0865045cf97c94070d2fa013be48df5e50bbadd9062fb6183b147f7dede8b571826f81d546abddf5de4f95a97bb75200ef5dec4abef4950b587763db4fcd61017a457c00230cb8aec3bd775980ba70362b6e8d064f81062eabc6149c115feca46efab3b703e76a9241c72f6b6810adda98e1baf07d6a7d8189f6ec869b54941c40080a91980fb827c61c1f7399539387fbec2d1d46a54b1f518859b3a385ca098b86039bba25d2e49b7968281e3e1c3e5c48f2012680d81ccedf131a8c8891b4134bdcfc70854fc7787d03671c9e55185793ff6926ae12f1dfe8cf246fcd33d88d159842e8dfc7c257836c98752b7152039eecefadd80ff76e816146635ed2d36fbcce101eee7daf1515676b9a2b203e1cfc8859d128852e25f9cf924c16d4a47272e495645a6dfde91cfeb39f4e6a1613a901e2bab7c975c885f6424b617475aceb396d0d3da14c102a69987f66f38599c60210dcebeddd8bbc80aefadb225df56b7f48d1ab0a8c92584a41b9fa726a7de8620cd32472c1b89ee1cd0e3da8b595f98672343417f766bd8d9c52f3cc1a9bd6e1c8c1e588c023ac6e5355e68aec6bcc303577faa7bff293265f9506c6107432145deedef7b254d5890c755a39f5b3aee4364373a931e98d5ec011d247fa9ef17a68b2df72810929a628f6ae634f4427c1538dd02e1c9962f33273cb6add06c81d6258de794f09700a9c8b2b6c3a30eeb00ece206d70dca75beff10e9619d80bf0a7d93f24cc82b33640aa992945eac34fff30584801e2ca0fde10854ec1c60cc5c4bf08753009063e7efe7e07a94cce2de1d2add68f2abf5e6fedeb161beb5cbac9ad02c043d3d157acf018751e1140776a7f32d71f34c05cbcdc9c08a7c7a03f596dd7164540566fc54fc1fdc2b23b14f002eff9066b55e30040ff5ac54b8fb6d9d643f939aca40e5005f1d5972feafcaa34f2a72d6ee03ed74fa5e70faa11ad4e8ad2d0f788900aba49c29090a73b3432d9ab5d933c115abe4718cc9e2a2d770e9cdc735ad5991455ee0496b0ef2465e39267af0e36c30da7f3ace53cf3f6010679001e39f6e2a55da65870e9793b447b418ea1e519dca3c2bf0e1d0b0b07ad96a0708f428173694f70a113c0a0f79b3251914d7f8af58d59d6e198bdd6155cc3a4468be06e0af9a1c94c488c9fc6b44e759e43695c0873c1415fbf56c065a3ed585a790bf38784ff3cd7baf3f4b22533d735684bbde582438d213bae7dffaf897289cd0052d6788718be4e3b7c071d3c6c7b75f6e0ff3437e48217e179e35db0f088e80c8aea5749c71fec4985d00647877c9db4a55b51f07198c232adae969c821be6ee6c2b1ebdadb00a8916b1f93b1724775ba9efb421df723d54cf22caeeaa1b6cc7567a4279647a6e099cfe285cb30cea5a1019f43cca22765a15759f20dd681057a0832833c15c54cb1e3f0196aff51abc2b0ccdf37edab8b536c2a4bb072293224e9d4e83ed427b8ab2b92f52a3fa6bc28269618922a022f67f778779bbd3d164aed6747c9639f1628a6643f47dee03112facf7431bfa1954ab2d58c7b02ee380b86bec76fb52093fa5419c17f20b123ef0b0b5c0efded93f18e2c0aef25c1665c3f91a3f7faf4dae9cbd84efd9ec0a5ac4521051118c1e28dc3282be83918c9b23e06363782ad6d6e99f69a016153f70845309cb9d8e85d0ef65aabb02b0648665ae39d5ca7ae9c4de2cb940ad8e9b5e0e59ebf2298c6e16fe35886fbbeecc719f000d9c9764f3f90f66c8f9a243bb25bf84ff7cafb76be8418da346319798866bda42213d5acf00d836b2a0487b7fef2fed4cddf10633bc7f2fc2c0e7e7c8785b9bc1eee0d2d5ba42fafd5360f9c84c1a9fcf8a76ad2916c31d66257c39a760621cd0ae7b4189e051036acd5aaded0acf934fef24fe71a14cadf03afd4b7c1752e0c2890930d3f74b2674bd6135555911face869062ba346fb8bfc45d09f224e69273d4d00d5451ba213c798811eac1b8fdbe4631313aa8e35ab728a1bb9db3c806c46db222980828ecc596b8a081368d73f184401ade2b7f6debae497ef70b13d2aba139f22f233b4299ebec79ec32f868786c60171f0633ba142938699a702eb57a26d9d6b2e955a90f1020e798b3903e9d9dd8f8c98888081174469697170c38d5737a58c8258c8a9361d270357e51b67011ebd39578f6963f18bd050d014b592dc375e006cd02405623bb724b1dade6b3cc632db58ea103ca4a3d939dee5df3307dcbbb3e3d0079fe70c6acfa53430f31075b1ce444454ab8208bc4dd2b71d3d8dec8bc4d49797d2bb3f6b35338e9f1100b6c079f327a639e33cc262fad9b18fb3746829af4c08ad4a84baf08f6cd31070997c6d4b78fce290807a05914db726d20735e0e7058f73856aba4dc8642c0fd52314e856f32e5d0dc7edb7fcf7c5d04e2fea3af94ebff28fa8e886d756049f0e8a4c2d22c94866366ab8b0350e1bab7094ed1337ce3002463e49fc894ccbfd05f133ab0500da55ee616f23b36a748c528ee8e2b792eaf869e606de86d3eb0a7822b7bcef21c010695c05adf371a88b0b36981910ce1317560bf020004077dba0bb55f26249beaa36e7da60d783cf89345b38e3c1b5928b9dcb5a677ec98cd4acdcf960d3ffd40e86c6fa43ffc198c2bb1ba99fc5fed92714591730fbc7a64ab5ef06e18b5f18bd37fa9c3d954239d6dcbba27c3081eb7944d53428bdfa189a83db26d864dfb4bd729a2ea41ec866b8814d8a0664f0dbfaad60dd54ec7c61358ebc416a6bf798fc65c408e48c785e9a0746548fa593858cdd067ae1e0b5a35e49a338dffb1aaba512f5fda377b8f3f4aa6c76f2d33a6d4fa73169a9a2cddbe44b49075efccb37acd99774e63769ae150647f354f0b4b93ff3028c66de35f1d715146cf5d5c1a854b45bb38a5fa45aa211f988b4c9daf94f61ceafbd989d168439c63b388672d2b0bf170b037e5c38e89df56f80d7c6645d7c045f4118fc79b7c667e0072500d627eac7bd3a17614934e238c2f575f4a978fd53246da9d3df02a28b9291cc09a71361b010d1605e86f4f58298cec9be2f7e17aedcecd5d87d7302b2290f1313eff056b100ff9890dd989f495182e2532c691d96aa97dbb2ce6481a0f76b4e26fcd97a02996c39347f90aadad5c4a65e62f9ba6f37fea8df342d5c6cdda448bbe7dfc4a461fa8cbe1c2dc0a78abcaa67129b998e6f9a913a6e7c84e36b936f4db32f000d06bcfe8ae2d5fac04cf45bf3fd3f117bb0b3da685e109a82f200a1e0d7f8522332e5524a3fbc6e864a86f9fbe30558b3263847d890afc1b64e835e1526ebf69d743a13717163fad0f9e058816a176051dac15dd0b7e2f0ece4d367abdb72a339898575595bad4acc3b46b597db68a5b6141f850d243fbe0b3cc113bf7eb27fe4359ddfc4ff3ef16bc7acaa0f3524f310679c03333d3fcaaf2e7507ba98f8dd1b770f36e426250b1ff8a9d4bc25c463ba8a7630a582aea3252e0ec28d656063d6177f74b1c88d457bf9059895e570cecdd6fa724d2015eca9c76ddae2798f82a181582723d0bd2fe875792e22bbd67b111812ef40703d6186261d6be2747c72746960fab45840f4ff6907949f20902b065fdee98d2c13ba04152bbc70eb415b14e172b028771339fb0ca708bf580bd2fb6a6d6efc0990ba5d213fa95f2efdd8b1c1b699841b8e154451c5de23871b54be129af8e3043ec5780cc395f325d33c4d932a30171ad6c362281b895db4b604d1d097b8f4162bca2f6da265e7a2d1130043a9d21c95effcca1ef06d47c6bbb7860392e5b77d17706b5accad18e8bd19ee8ab2e950a5d8f6789119a4dcb02ce64ad5fd29879e948be85c8c35669a06b2fef4fc27ad44a3a5cffff063f9268ba3b8c54a777bb750eac7e3f3ee767a4eeacb1b7019d3eac82fe5f943bd042063df081da663ad14e7f4661e550e495f413002a6d3eab63e159baaeb60fb7766baabab0d22b82221bc37ed6ca672ad60102c15d040e6085a1f4fe67bcf63da0a15205892a04dad9b3ea918adf24d6479fd16e935badebd0aeae1cb6d505ffc29abfff2708db39d1ff6420288b3b779d291e3ac4b944512eca4f63f4e1069281a089d91d3363d15975ffdd1b103e4e2c163bbeb915a5d08454857a9d29d24b72a7e7df6e3a7e90ed517abc95a448aa0179959285247f17cc8d0532fb13738a6a21738ebec71e2e68c55d8a8b77d456b385408650e627970ef13765744f4a72e4990912186a403f71bf2a9b8ac7211a0499266466c65de65157d36302cde084d348ba46da3efc430677bb5b34f75f39f16bc710dbe9c4a4869cc6e820ffc59239b1049720bc24f5e59395f0f0f153bdbf207df37311e0d85db2906f70645c876c000583812026239a535cc06a4a6c2201b19560bf574825662aaea2dfcfb3551752e89459e4082e9196dfbe1251fdb94b9f997689be8e8609d4d78fade40844bbad5caff8a07376bd83a13141c14d0ce0eb0a9b2e621cd7e031660970aa4be5f7dcb5d15c2bd2ede463c6fb2bb6bc1abcfcd7a1af96f1ae98ae81d315af3713d000ab889760c12443ac5fa79a48fafb39bef31b3c3b9c636927e868259e64ee02f2f9a5ba0b9f1c4b2a9e7cb48beb319433419798210d720f6879e4cefe84130bcaf22c1e270f3e7262a578ced12348bfacc7ee33573d2916ea63ae14659f467dd8e5f72115537fecc1406e977438fa47375d11d5327cf409aa1ec22b0d4905084e18135917ce073aa8bdbf4d9057bb2e7ae21cd46342745b6c1a43631a5a25baf33e59e461339e402f29d787463c8d5ac2a889e7d740b7baaa588024c683aef08e721ae1f880966e35e8288b4724d97f6feaa0d812a9e876d10c7c8c222742ed14764b183b66100f3644c98ee165abe1f36a2395279ac1cba57258cc5a26aa5520a16d77f075214e439b6eecf9791cf735066b66cf71442b377775018c9ab44312fb5a40c4833d198a2cfede24b5f8bf7e4231c62c5f33669a2ae631b3a116af83acc02b72e05819f01a5e1f0492b5b11ee1f3a73d8bd473bef885cf88b2e8e35189bbc8ae8c261521a0000cd0bebee7295e8d35df1cd49f078e68993fd10373a53eba652a3f4be4016b27961e93935a059a321c20970e694c4678813216632a684de2ba44885592672cf46e54c9ff27d01b29676ec1c058628ac1e7cb063885c6f6e428195a37698c7f1941c3066480ef3d4c8e1b601b6b65c61b21c10bb3d84d09f7e1eeb38b7c94d1fc658c57106b39cfcad009e4e4b93c6d969b0b7ee231234cc1383e71623de0c1930db8a8dbf266df0e2d924da51d9f49e836b82d2ce0bb30f50bffad57cb960f448965a23a6057140f7da0b5e29caa6f95025027be799a52fcc906cfd6f55cc96e712e11ba2bdfefd3ef150f1f04f6d8de5d7f5f9f9262ffd4c0509078cfeffc27d9bacdcbd99cfea305c080c296d6699654e909a3f8b05ec63ed6bf1c01f9b1b1ebcd5c3d34f8d5e8a5d3386626297e31f510a7dbf67751afc4f77effede7186e0ac5a05c4cc7bbaa0ca610433f49bc9518f1ab48049c1dc8e7ab9ac646e024225326431294d5335d627c3a6e9e8a06d8fbda1720dfd868c071682118c570782845edb082de727983c8e4be4aa9196046dd5a92f7e3e9a3d993613c76af2ed052681ad82d8446aecfbd169b3a659d27f0b012c45b9fd2d5b022492fb34176720daa6af6b61d245cdd44a017fcb0d82b4bc34d8c14d8c815b75616a4b8a0825658e903767625b4514c8ecb6bca7e3cf28d065a4b18456ee149ee611f6a6ed9fc8060a06b0f0a6e3de41e7d4628e915808b939e901cd0e48c11deb612f94b1eb4d589df95e2b19077aaff56d57afa46add91f6274ca2117fdf4ec9ad15f2ce0eddcadaddeb39117da645bc127188f7596ca6c7ec46914c17968e3c2c976a4d71f7f8e853a558d6f09cd504e0475641389dc5811d424893cbc25778b3f9ffe28d83db243f69d7fde1fc646d6726b7ed9ba058a2a69b0a368da3d7da417d71552e231c3334b7b37884f84d831e2952e80b10b205eb9b5c02697e110e3cbaecf4e5af641335a6f8c4d00e8d2862717d2164e4ef64ca969d66b23cdf3bf06f801fef9553859094bbc872153589e8153a49c233294fdffd46656c1304642139fecd39fbb08abd4b8730169b9615d4809910dbf0a2ccb1fa8d0c38c950265c77fc4904f97c11c5e59b9f92bc653e67bbb8ec57e1cb7111dbba62ee56eaf48210af4f5f238490a4aec16c6c60fb4d968915a5a6fb7e6767111a6dca6e279498aa016965c58939dc65f55863d7c21b6885c6c360b46772571acdd7b3eebfbeea2a681e8e10e4ea4d95e259a48bb53059650c9914c768f1b9cdc3998558b5c3fb2bb4a643c85cf4ac4582d554fa71a40235700747589a8f837ee85a9c66d18bb3d010bd28f47505c45bf7d61822152e6acd38b3103115e3f4f4839d9ed1fdc3a9abbdb8885274ebeef30278964b4833509fe21a75875b7a1e59aa1f293c9ebb12e2f8f2f112f99fa17c5eb3e7f4991416e2829f7fe1f851fc3fabfbb6c03ca56f72f11e5a21da6d3a6d9696e7de32137173b91c2f6891fe71089510ce634749312f9ac7124ad7b6757e4ff3d7594057e65742c447d56a91e718ce52eba5bd2d70c9fc35c463a9dc1c8591d8dd2092a7f6686bd784de00568fc57ace7ad9ae6805c37e8b751349b9b3ef1bc5cb2cd17d7a11f3ff522151311ed21e0b9c9c5ad9f1e4787e9cca1732f1666fc70b51e9764e66d1b9d30a1d88d75524d3fb53e5fb3a618b50200ed743ee6b165b147726120793dad8ab8b10e937e32de51ec7e3f2a3dbe047895ea4a6ae75739ec0e004cd0ee5fddea612d85a1ab88d7d2736c6e5272a40a3e47d013763d5a9b196a4c494ebb2ad4c6f72dee216b533bff8a61fb1a5dc95f39b4206ea2530a7844e77df2500fdbe7ef344d09898b7f3c5d8c79e3f9e9e99981c3df0e3dd7505696fde18c154f7e02d9bcfd47521d7381c93ba2cf41d78f561a3f53eccd577758e03fdf162e38e6b7ad8394b396bfd6aafce275591df4e8032d64784b7a731c408694c16a338d771eae93499d4051f8c668712f2c64fdd596bbb9a10a35766928428914a38b8a557856e13f97eda358b4489ff9ca5d523841f17f746948d5aee5698785e51492d8b8f6b6ec652b0c876ceffa2ed67efa633f66e21a5f435caa7a7dcea449d8e8a9bfbbbf8357cf2380a303ef8660522910a645ea39fe978baa4a3fcc588d283046b5267851f872aba05703ad893f89188b0714dbc4866be93dfb1d0d04e374ed83abfa660da4c6c609a3274e432b71475270e532f06da1210163895ef1d4a256adc7f300262158de51086124508d017712fc2eb1e2fd2d92222ad09b2f53009ab06d9bf5f3e71e7383297e63ca640e44389dbb99cf0f4845f71bcbd058bee28d4db1d80a328aba88bdd9a80b726bc51e53a92960a985e7b86ea2a8e88e6e3641180eee8cba7303d54eb60aa3860a0505a143ded66dc49565e0a80c0b31fb85f4966a2154c9d64eabf2dc8ef2a2014cee92a3ba64c27b3bffa528c9bf353195dca0e95329d8dc1d50b8d5f6cba99dfacd70180ba326bafc24a472a65a5929d7928b11443974187af4baf36da0e89ce5f08c5bd698fbfe81810bfd7762c0f5d975fe9c778e4f1166a5e3d8fe0de5a195e128bee49302ad6e1788ad555b9ad8ca4892d11df7867bb6edadc878894a0e199fb4bc05a34e04be99f27af0916cd68dd2fed1b2e9582cc30b8048e2f848d49d2955fd5ba97f0daef913749324112ce2864ba84998510a5281c1df35afedd4f98e3eb6c7b0c0a98b3477bc07e074614cc4d85fae7a151dab1a2ed42c43a38659b2fe859ddba5da7d4f2a8f63442bca4dd3e11b4b981071d764b8e02feed5b956eda0b872885ac801b678a54ee120e31429866ac759f6f373a0f1b95a3f1b42c1087371758e01278a69eff2eb0a2f1221629d020c7754b0ab0de3a0d6a0d2cb1e90f23fe08faff863bac1c837bf6696b734d066596022331c3d1cb3c3bb9be964e396a1e856553b6d968b73066aed50439d8e9a64a332d02a891c1d6e29a81e0bba8ef5a9f86683d83d72391b67b62d1780c77b6457a265da0b3599e0b7918e49208cb5cda359676c8d96191547ffa8cc717cc7b6a6f449349e1cc4beccfe7613f0d3b715e4882a69ef9173ac2c261cb62291602d61bf53ad9652186dbde45ffb908d1316e4ed3c1d0b21e95ea66745ca0f5d480f690d2c519b595ce82e967644cf7b72c9cdf158da5a7e8443a6c7b60c129f2063cfa9b9f8989065880eec8dacf623e93db8e99c09cd5d94df9ef277ea6471ac2911a3c86a92831fbcd52e3b3af31ff8445f043bc48bedb11069ca2b250ea31fdd4228cf2f7735b6012dd9027594afd09f0b5a38c1675fa7f6035d3b5669fc3375cdf438e635b62e7b4ddd003c8e366671bc8e9ef38d448a48e52feb48510daab05d38fa18c7d8c0b3a5e8420f933737a145de6130c74925bdcb3e305a07202f91385af1dc4808d026d33e6dc360391b8358dde02b04e6935c783280eb340fdfd4d015d2e525dd18cda917730df9d19b7eb51ec0f53b3aecdf46ee9f68fbfe0c71896553fc8e85115080ce5ae3937d69820757d54b4ea04476815a5321ecfa8667b5ad5059a4b5c9e4e0968a38900c7faf1d52b895c8420f1ec7fb4839fef81dc2825e602ce89f3c06902b61fc0aeba09483dadc596819019c54d2d1c52ef98bd2f7e6c3053daa2cc69529515d9cec00aa1a6aad3c4f093857fa82cfd78bb540772400277753a1196bd4005a91a3650f65460b3a9a36d6c53551053b95e24d1ec4d078cdce647198ca0463cd7cc0501369399fca08aa9df985e11bcafeb40899d419a851af6398eb3c15ce33a3d90055706c1da634e3120aa28de3eebb9bcb14e7dc2e11834b12347dc58b2292aa14513bb993b78f8121cfbd1778e1ee331461a556887a63c6a67d3265080f3bbf156f186a26bb800c35ac68c0a472eab420aa380146dc9076bc00c65e75e4dba58475e8b2c77b74f292db225fde4f6d2a959f162855519f07b77677a56c7e0e91c7154c9d20e400eca9e868e8cdc17027ee04164bd29678d7b8e6319730f060ca1b246489803918f62f9b7d759add3f3f4dad0a6ef1de4f4077945db34a570cdec7f7958103e0f73ff1ee8c466ea692d1dfaedf7e7a7e94484e1ca6204d044f468f4527844f765cf4eab0a33a680d770ad3507002e35ac84f6687ca59e4fcc3bb51955b2d4d98068d5d44a46ed5ef40704d3fb7d10154f4aebeb5d6a305de2cb6b2711c5770bf878f39f35779620b1d695c2904da2f6a595852630497caae4cc9a822c4751b51cb69d635e6ec47d6972a29c59515e2eaee01a5589c03bc24916b76c32ed9b78950e910211e331b033c052413e24ae325af29db647dd02ca06cc5224a8ddd55f26ac43a83d96e0beae9d7b9ffa31d515340cce114c66a177f8d7c291bdd49c1490e880d8f82ce4ea6f7651404d81367362f2a3e9b0ce311eaa8fb8525cf8690a8f943ce49bef0aa03caa44fcb439b8b7a31a72fbb61208a04697ca3bbf8b5a0606341a0e784d6cb82b093b274ebb4cede80485b612e321be1166e3c84f2bb1789b343863ebaf12ca70a92ac55a78c7998764400fcc9812fc3e8737af721a4d5cc5264f3a291f25e2b52abe5e07a38ed0932614e87fc1bee6b2a8b66b83fbaacf3f1b49270f8c78c5468ed6a7e4d2571d60cb9808c8df22161e553f1fc3361b0d4227e26d087c80693ae4c4477afa54cc53c3b15e1b3f4e137f9366aa52ae0ba3e5f2d50c84d243d55326218faf8ffc2d6e5202bd20e4823f1b4574181a7470dfd658471b2655b40395dc6359ae87a53f19edb007b977cff3c4b0dd1b2b23d4f4b5103cba48612cc2a8d1dcd208f85c903caeba0e6d3a7348a6129c86843df4bd2b5a50699955e9c1d6c6200dc5bb2d90df887813da1b9acc7678755e24da71ba4f60720b57ac93e7f8ca9e4c9c0be6a608008e5f5ebcb631542c9c2f6c408279633b43dd688ccb4679ea0e0d60267f194210ac7d7ff258f76525bb51e2ef7d72bb10161a72083e7de7ec3ce96f53ba4f83eed496525ee2ec23ba0e06713cb094637f2863d945432ccd307ef45e62b25266282b5227cbe0c9b27e2eb55c7c15510ecd3145c01ba5dfa6b57ba234d1548cd65e851953e0fe25805acbe0be413d12526dbf031d07f8e1177d3377a2575fee0dbf74eb62d01187af05ab977b1014a5f52a5a6f20de227f3a537eff328edc4a170dde3649d6778aae839e1e24793b44b4251518f4f39a2d87add841b3eadfca7f57d968e27587bcdf516b425e59866f31c19c2ff71c575fe262536499d92873266e559d4bd873147a449dfc72d80770e045c2d02bc3cf98270d5b66031cc3a8020e688c629886cd664a2e9e01491262a51d5472440257dff2e991101178abdfa061850683747fba1575df27f75a96a4d8aa64da924bb79ebe2e1e23ecefb00e88157f648c9ae937a5cba7d26dba81f9fcef54a4d550b6977656fd6be5226f77799b1b731f7f6f9ead317bb6a370075e4b5314829a0bcb4f67f35435df3a8303081a1d427409b01ba7b9824af827759643cc07c9ab6c20fdf9b94a54a3183d21b6f475f7b7cd8a515c1cef21b386368a39d855a92eabbf9e691ff24556ecaa9e551a8c415d89a0305c15cd8fa9838fca767318f14de9197e878c573bcc853a83107909311d62804fe87c3bfb056cfd43df4c09ea3a0d21f933bf722bfc924d1430ba51efba89d0c5e9450eb71f9e016ef8833d0a06e59829e66398b1114d39479f03d506394ca034388889b5333f1d0bc9fd8f09b7ec5cb4589aab56d96b2a2d16aaeb74d81a011ad5e54bb686c1a8df3a1447c7dc256cb670644010f68c1433c187b32920b9311ed70434f597258ee69a55ee5434c4c80623288f8cc9889498a5fc6653f4b823d6c3e6efe83d1bf4950ec13f9ffed06013b0721962ea59b8ca86cc06f05cdbdd0d2305d93abac05726b527177683bc28b149ffe1fafa89c009dcc0caf55e1d9bfcd1c4fe397d3c5fc0c6da383f4c41daa66263a471ffa9d981e47f85ed33653fdadce24b56b94fb30e567fc6184e01a8905a7aeb5925859118a1060295d50487ba0c1e76ca8f99e22f99a39b809b6505842261b0d4deaf7d83d2fb26bd39d2038bd1353a36ac970cadfdb87056420c78d63ea2b2a7b8289306c163ad35031750bb6adfaedbe1a7d51f5158cc4b04321c13926f56809b0335b6d88b5f779906cd0fcd5b7c0f0bf6d57490865b51ac8c9710997aa076ad1c40cc145e65c02d25485362c3f949763200c123e7cf1bd09cf556070bc874f0ab53e6988f439980de48974db3aa17f6137067fc13aaa24297473b2302d7b44265f473fe4455ee2f9d773feb52ca364a20df1ed7c6c78be155870a586e2132871ea4fad2b4add1d2c7040b46554c5b8586744dfde9612a76439e16bcaab8daf5cc20d89f880251a9fe6208c314095da7ac5ce369c57a576361cb1f66fe1da7513f997fd3c6e77b6d166592a749034ea50feefdc2f7a1bd4e6ec60fecdad23fcfcb829fcc8eaff523797d9dccc24145816b74161f3f6c47ab2b8632b0dbfaf01938edb025a9c9dbbe795dc542c24bd7135c7c5bf361c1c3bbf4a50497c9ef18ebab83833e4452a3df9657850d114a9d102ab023ae9cdb3db837d1b321a9bd69d9a278b97d1e086a2401c1ff69f5b228bf2b6cc7fd1e4aa6433c0bbd64a74a42591dc0ddf278cc12313d7d1b81c316018206e1f349b4ee5e3ad47562795c9478d29946e442c4494b6b6ae6415258f179cf340a9f99f9d16fab1a9f05726e37897d034d3f9b469daf9fe93e4c3994196a07c5f9128f04a17a8261a6e527629565c2890eb803722ec91e30c06ff14f407809e92f184c45440b20cac6f6be27fa691d140e8e584b623ba07dcd1ce6103c844f125671c253961ac00310fe5f4ab96bb88e7d7d7e1ecf63b5af80088110724d6a5ae7a4f6970cb920b3c055d82daf8e0b1ac53aa6679f5ac85959ab6264dcd6528d5a3f1a7c7fb9fc0e2ae9ed1e10a3331a450d6887fc51b0861b5f461369ae74099b381185fe076e2ea69b9eb54a699c9268fce1b3a07daf6b5dfcc4c02975307c9e725c3047e0fd1bca91f3133a5a14ba5cb001ed0523a95984b1a5c1a57bae0f3f556cf9c0ce59c2c4f892d0502ed46471a6745a5228adc2edf9f892b906b5c0e4e033feea3215e2b140993432d4c96c91e566cdea64a5a43648440d6cdce43c803ac6c3532d860473abb463d0737e6634aa9b20c78e73c3bbabb6cef59c8dd38fef882ca0c68866737731ac94fed1f8ffac930777301a35eed5c538ba913a1c63532c5fb6188b5c16ed280267439dca48f966c2a43b4ffc61261a17aee54da1afa7b5d2a92245beadff99989eb90a7c1acd3c6a066446987f64cbd6363bf750761e4d7c6c67f15118f782c7b9dff23b61bc124650ca02f0c8390dbe4ed73f994e1e5b45644838c0c6064624dc7761d3254dca99938bf376bb979921dfc19864a0fa2dbee6eb33800c50e4867e4ad14604e053b9a6339d5aabc5fdfcd160626a11e805572666d182eba3d983ae48df106572c7dec35eff7078d9ccd7e507c1e9a6ca2407231a0783bf13d201c4ddae4f9b77b4fb855f743aee3de013ba45d8a6420a476e52d38afb23c75f2f1bffc4f2ce861daa4ec733a757be06c5c63d086081020ded0e38a7ca7ffd27ba5cb21bc403666f301572e1763b2e60a7c0847244f540786740d26f0d1021a2b81ef853b2f07109f7094d4ae75f4e84cf1bd63ab94cb6a42c38b9825572036ab6961fc49dbb24094b2de3f3365613a04e557359ead16d4ab1e73be6dd71f37e88123c8b94c25c8b2bdeb89c517e413d9d09c6cba7aa3e573a1f5621948761455c665b713877db28d7c062ad721bca8b7b28ecc060b8ed68b461e9db67d4808e9e2446ff7a9f2e59161e6a0fc484afacee5843ceb45e6fcae60af3ddb9749f003d9889039039fcebab673512ecd739ff5b610a9a90029213e112cab2d83a709e19c7ab3ec16bb60b0a53f654f55ad2b734df700a100e5f2ccb0cca15802cffdfcc8076c8f22dbf9a8d42bc6e00b4548acc9bfff67c5d812ba4b35991d6c58fcdd60cd3f708e06ba59abe93bd44831cd6e403fe2d71b54ac7d813cfb4eb047bf799bc95f460fce9549b7a9a489f4ad105795689cfcdc9225ebe59299f6989b58a3e0065a9f646d82aa27fd954f015889562bdd4f897fe642be846cf3afbe2acd4e2e40e842ef4a44956b251a8bad504676ebbe99851701584f2f4f69aade1ffc639cfe3243729c938c15f26f8c8571b5ae94b02cd95b26715034390a1f1648cd35b1f0614baefcd2d7cf27530d6cf8e26f553ecdbebecbc1f6b0f2d3f152c5add956bae4422470d5522af30f13dbeed7580f2d3c9404cdbacd60bba697e85aee7e54ff7b4a6217cd29730c1ab867cf530de44478ab8c3e57c51866136b0497b89749c72c2fb8ae2b9cd77ad8c6d1af8878b66f64acf9df52b15d9bff07669794a751cf198cb5b52228d9e810321dde0381b9e294a60651e199db8bc0784ada92d86dbaf246584dc6c482ae93fe74cfed9d2e708f49de7513a07cb38724c7ae1cc3a2648c1c394fa85c56043060ca058bf7dd4dbe8c515a8057d7c56eed326905f25f00d091a9f6a2e5c528b670ed8d20a1338100dd2df256b7038ca7b92675138ae0283cb9840c9363a320d4ecca6e37bce9776ea21add8af8d470a33dea35c40e2fe88952bb3791de1677e7b9c32acb116e2282c2c78875c685ec1621da3bf69c3ffd3cccd9f0f0b08fe8f1d126f9db0440280a00dce41ed7a43ec3e6429f119ba69c536d6e384fc39715c54bd37d0de9232dc2cb4be2c437cd2b225d1e663e10e49c3de42bf6bde842fa49329adf64d81b1574c368a443aca940dfbe491a33b63db32b3190fe67dfb7fb86994eff1c294fbcc11ceb35ce80a600f80b8c79e60a88a9a38856535203daea2878362368f2e1441f5252878b016cd943828f2eb46da23adec24265b6af97693e065848af0157b3a6a6c65a04b0bcc8755eb1acfbec2792364ad0ad226d5c5a3e7f9ab49de80a49acf8aa5c7616bb4a67c26bcbf466eef8be47fc155ef610c790591cecdb2173295bec56ebf4fd91ef9fd499fdcb68f36e11e6c618b84692cd0ec332c32fa652d952e73c3e3dd35c55a9c05f9b049821cefafaf3a59d7680aa9ce02472e2fe5055125c9b9ba2a7b25d5f6906cf88628b994085604f93a3f72c71d81758c471ffe2e3aeb47a8c17fa5d75276d4fb1123b94098ab68066b45f387ffec1d1c79ce8d905705fa504c8d6811cdb28ff827c1848292ab86f43787157dd05764ec1482f6adcd99c3d54b85c1896083cc31b5c8026d377cf8a4ca5a18cd75f84ae7461a81045c0290558c20fa6956c4f58755dda891ac458a6c915a2076467e537eebe355505fcc2c973695d7dea386a52d2155de2dcf4747ee1374bfae34f1e26bc7f26036a53735013c670e5a97765f637723a0404931b578979b94f25de1d78b8bd6dbc8190112f05654fcc37a2e3af0cb2218c27af91d96b4dac8c15c7891b08e339780fd9cbb3fc54ee9521ec8039151ae5b447e7d818535cdf3f51fa49a9099af7774862866a17bd8cc15acd395773cde28240aef35970651d141b1b4dd950f79db94e41dc623161575815f52f34b2c009c622a8dc0f5e3841a36edfa29f450341137d0a61620dc62db96d6a54702d96b3c71782051a54cf1dd63fb6ffac8adc98f0f85c2d472018d4129e2458df225c357e4c77af6284500ccc6512dbf2368e1057a2a1bb6e95cf5e2421fe6f0b616ece11b16ee36e39ac2d9919423c7d59e77810173c6d6395a93592b4626886ff32925dfc8d6d252ca7b642a8f96bec5b034591c8a8dd5e5bef050e3250fca3698de501b4147c104889e5653931be758151adae8edd7c7a859048951f53eb462b6eb17b571b9324b9e45172bb5b1c93c6923255fba2305ca28cde0c57ec6da95269c836cd41e3cc9f24116267ca0ccff81d644843f10689364df823e60110d295da8a109b616f77464182f1e933abee28bfbe3e893bd059ee8983a0c28621dc1d734c04ab7e3c39650ed778a7afb22e811aae45b0cbd8f2be085e01ae9ae29d98ea42b353f053e1b3e62f0260fb4aaf91c94bedacb06c9814b67792cfc18fbf0c74004714de8146a771fee831a8819432a549765e3d98e0381c4a7595d38a2415dee9b38714ba48f3c1346c2e5a92f5a8a80ec390e78e5faf01ef784e7f9a89746988302cafe62ebc6bea14110f831a65c195a164741beda5d652b95a05b22573d231f7376b3b80335d3fa56e8e72c2dbc695f5252b01966864fc7228549da767b82d7752558f7ccdee1fd86cf25b09c0bf84e6286df14c5cfaedc4529f20863117eeab700bd3cbfdfffa778aed414080fc42a8bdef1901c6d770399857789d317faa24cad19459b7870e7acaa3d6eeab55af56976c683bf101caa052643c878fc505476e8e9e47a9cbe4a9de664d58c79c5c9b66a524c631975db9d4bab2706e97e207a4acaad781d453d39f7a13297459ca8fd3c5486210568907e32505764e8ae1315c2c38b82b8a2196ddb0ba106aadfe33e9c80d6fc404353b4e44bc6695535f505b2e850f3db9741e6aab44cffa74ab724f1a064f4a6db4f5ad8eec214dfd50f7a48b42faed430a590e582fd8af38c59dc0732f03a39130abf80bd7cb216224990b0290f837c605dea7c9ed496a879ca50756c22a92036789068b7ee0b4680d98b0e5a2a3e3087a6eb25e717d18f393ec21ccb7f3e4216999d30ca8589fc7306f11d49e2a2b7c43302697d17b789c3bfb8b1cdbf4517033b234913ce80685bcda0ee097f8a669054bbd016d0f6c307acc0cd308d59cbdf7f87e4aada45e74bfef42954633481911d034ea97cac9323a4799fa82d4714ea6c8afe0da1efa2e9d869e1aee36a5d67b2d0511f77de5d325ff0b42e06c2bd8551cc0cf5cac7c958f9a625ce53dbf76217b52e473d57d1c906e24aa8c34d192ee6fb88cef39afd66b847e6ea395eaddc45d12a1586eb769fbd21b955ce3a499ec868130c8a6f22abda5a5c86c7acf53fec0d1373feecfea2a35039b1dd5f875e715a28224a278ce96ee79c13593e2cba3025232e08e9214042ea99f9380e35587e160a00b41b70f1b0eb4dd71b07336f46079c25be95471de8b42a9f4fb03a1ac104d4ec1ac2c3acd51058d10ca9d3b7b5657d7dec74845d0447fa39bda1fe7dfeaf26daa8fae39fbcdf733ef7ce643572c5d5feefb350df7bd18c9235a41ecae829193e2f47b26408a7b8e9e844158ecaf50b395722a6a476a1bc1212d9b3430c09e802f0d3ef353abbcf29e0fe0358237e2049d1f93e660f5ded31e438b8e7393b68cc6880d4901044081464687079bb02607a4977416ce5d1823d1d9ebcf7562219a2bf767cdc7eaf0a159fd12431106a23e403812c4d948908132242e1c97fabbd69a565b58e922d13a728e92b04c877e05e6e4d877a9d0a3d094305d89495cae047517463b8cc04fff0adee7f44858a6acba6c5b763447b03a42c1918dfb70f54123c18920b0597363af65b66eee6962d91221d23565ea50462518a8e60fc5ff7964e11cd80d04bbb2412e29933c293db3ec78a04f38802ace93251af084677107f9b580f4890a1c6bd45e3225364a042ca09a6a6a5aa53d46f1e3b407fad951694d4c3742c43e10125e8699f48a8d133b8074995abb90e6c1d757aa773558d4a4aea451dafe0aa9b4c926efb29afea8d85959927d431b3809b69c2e65b59e30443c66cc6f864c6eafbd7ef32c8eb7a1dc6a663f5e02acc2249a3a98c91ca21a25544af94e246616c099a4aa12923ffc2ee23a3694098595e2b8a06cd236b39c4977c6e3a1e0a98b4120a0c360bb9127e332cf3dde68d99cb086b9b0ee25dc287e2d3f5420330516cac8a4e04449cb6076c795274f1c54b0ff8d554f38526b09eca3771606195c5c51c7c995548e91171002ea86bd4bca9c893691fae0f689feaf12201d31d0f2a1a3a9ae7e3b70d787bdc0c3a2a76c9b5713ccac9026491bf43b5323140ab2a0547d84ab83a48369baf87565bd8733c6fb9cad027f435f9ef0cbe3c402e5182fc8879b7216394b33b855f48ca8b1f1ac798bcdaa6dab95be3da780be57dff876a641e71f5da35da0490d0639b9c178c95fcb0e1602ee3f645367b2c684b90cae2d4722a1d54afab89642e008970d172d229c1fa4963635b5735e3c2c4ae30cc47a0a906c85f7b38a9335a24e87c2f74aa5c94902d4ddd087a9d5f65cc3fd5cc543545854a47a4d0a53ca653be46c4c0a5bec89c253344b000bc86379a86f2fabde29f2b56e08d6eb3278689e3611b97b22bbfee3d3242b7451af288f34c3ad642ed7352f182baede02a5deafa1844f1084bc4b5bd9ebac1e5766f7038c65868c970dcce1525c4ba4557cfc8647ec40f9043c4b7027350472693fb7371c7c212a368f1191f1cf1872aa3de694ebe05ae0a4f5ede7131856c643d7bec87cb58c02bc22d4df105cdd1810d4b9c07fb41f4cb824c03ac290c3a9d5a76492491616355679ad42bc98b06723ec035049726cc3ffc72072ff46ec39a9e829374b6545d5a2b5ccf34fec3f1755ca0e6e5b228e0674d8df64e3b8de4ba669490198692837079a8828cb0c2090ded5cdc360f67f21057826e4834901f4d306114805513678e4823b290a28beb8204ef99ca8e0d6429c7aa3e2d6dc5ea23ff89d325352fe7c3aa6f47f67d26cca3c51c383b62d27b009235af15ba039e84cc5755e61052f18ff2b16d2e7fab90e94cf30c36b68c2368727cdd247ada97ce1b5ca19e47f42a04c49c1636a68d74e5cdfb53a237d65d3dd421b24ba59ee8f6d47bb3e7bdf2472eefd148a9cff0422d8fdce5a87c43ff8c5b33ec890e619a190f147800cab6d1835ba2bfe2d932e9e595a87246346c5468f1f7db9bf08cb1158e2dac85ccd8ffe8189e30bf0487cdbd5d1fc1ffe34130b8b1a2191c0858d64f1e216a45fdd3e5591f787914cddb4557c88e6f5781d486fbd0c2dd7b68a9f3a9e05d2d29e7aef4f851d421a26d826fb69d1063815db49414296c7a930467649f5b875cac06134f9bcbc2d6bb9c88084a6ba106a6542bd03a786995d03f8c515cf66004b64f5f7bde8986aa02bdd84af0c9f6f9954e86f046950eb139b09f270be9f4b5fdc355a972f0e136144f1fef3be3d48dcf2929464b8bc255c4e814f000db912e999e59d37c272bd5adfa4f68b237bc851c2510b358d194adbd97f6ee38458de219fd1faffa0ab3dc0591aac11f61a3a9342c085d23b6c844eb3ce8c0dcdac17553eb1316d89ede3c84622224d63120f1a23cab58f5462386ddb407afc118398e304124df2358778987f85588356bf2a89874b9b4f83e326e36c9dbbc7d761fcb81ab62a72f0aa03107a5410dfbdc35b8c25e048c25ddcd79ad53ff6cc1b00c294b420c15627fb66d76f93fba4e560163f51766fa15d207b63ade8db5d216b17160b167c098cbc26f19837e15a6bf3ba37f93d5ecce0c14e2c7c780debfa99eba75add973226988bfac7abc0d4f0418469ba08cc4305c60672c97bf71e832de7d48b7cea61ac81e67de5e4971440342624fda46bf6b8af196827b9f85b0ddad4746b67c4ba2d7d4cbf1e7db99ef0a787646414d6a779a05643a821e6c7d22cdedf473e70050f4953d66df272f74676904ec5129fd5469762d8864a3a15819ea7c5a1716b628862e2a4c318d7b96384b75c0de290c035d3444bcd196a3f5ad1464eaa0e0c8a3190cd3d00f9c5cee18c86fed91624784685acbcf82fc86a928449460dc5b791da0e973f110c6e7230bd5b3ec98caafb6d4ae0bbc515664ec0251e66d8f210049797d280563418218f07e430ce2096600e2cb2c797230b403f21ee8e88d2c3b03ca7b3f272b0daf2ce1c2eb069768d92199b31fec315da1caf22e5a422410282772cb91f9a52f7148628889077b3f81d145b8721db54046fcebdf6d9c358c1578f120696e661f51d1d99a44448873e45f02fd7682faf0b7735c9867aa8673b06a91448f34e3f73f997337b47e4aa66248682d88f24daf2bfc0deec8d8a6dedf6b707da048eb899dabb34c4fe53de0fde66e2785d21c790ab1d1584bdfd96906a3ec1c269148a6943da1c537baca09b8adc5b6ec812888e232c76c29c0db0c1c18bbc93a81920c6509aff95fb46704b342b8eafe9581c43d61a65d135da188d4d942bfd0effa1db8e068cb6618f8bff6c0fe227619aaaae571601e749fcedaa100be7386a3c8b68694eaedccb2b9d2e0a6356a0f8bf1b7a2fdb3cc696321fb76a0c35e3f3784164ea184229a60deb76fb919e6860813203a9cd502bb542a216ebe2a9b458daf52df6591c6c5f16ec34b4a35f5c0b5edc4868fe788465f70bc7340ce661d43c178fb6aee2569d4e1f4152d1acc5a32879a6c28191828a8410d28959acd2e51a37619f3ec1c72e425a37065f49a1cccafd1f2b517c2f058133b0a36ff95b6d16274a7776df502bc3909e67bce5d1bd8ecd3d86dec0344c14448ced0428b06e309ff6b61ed1e128fae6728c921f3be87180fbdef2faa17014be6a9085452d7ab3133f51e41ed39d14972bcda0449751868f847a71166f6336df799fca7118e8b474e077d2ee6b73be947c9d3e53d662c915cfcff1f09d67268b0f2767ee0dec62708beb43be805c0b4511b97979176df458fb1a925ffbb05e4b7c58a20946a2ae788f8c4c1559011bdbed1cdb72b7cd8b3bc07f4c281a43ec59b2e169ea9fb9fe106257e8db9207c739374535f7731ff817fd6a97da5aa710192f4d4a88abcfc03ba764bc7e5b372ba36252ebaa2cfcdb05aed4e0b27401e1befc84ecdaa343a4a8185f6f0290ffe91d75b1b2518dd4550a4473e48499c5a92fb457ad30aa3943fb505c14649e7e1c73824a409b28b62cd7363d112292325edefd2f03c936d84995bd6a9d1654f69ff2305fddcef8421c6fa5e95e0804d21326f29090661e8b7d29acad4ed70088e0a02d9e0c20ef28bcf6c6e37f0ea5e8d101018274b1a9581cb0e4ffc249c6ff21507ec348c2b295e0a78295c70db6da3f61e3e060097394d4dd297c791ef4b56be9b01a29139fd0b69e035c332179ab95b905fa9206a6469c25f5b040e6d41fc75c41af2551b1e653bb4cdea718bf56be7aa323ffa7caea162d9737f25854562a0e86ff89bb5933016132a74321b229255a7722120b1cabcc76bdf4bab94b18a321414558f4363d700eaea6b036f292ab2ccc250a1acec76075af3157ad8e301d6c8a38a4cf5c3de2693876f0454db9353919500d13528f47452c4986d3fe2629a3449e8d878f64d29b34b275e4fe742363f99640c3fd23b3d389f23ffdb261c466726dbbcb3c34afa274b28901d1ad577fd38c81fb19bd7550062bb85d31b513614780a02b6b5e3b5b7887a79b97532d503b43d1c7c48c96829feacef3c031665551659f32875674e20f38721cdc1e641ce9fe4e9dfb9e42bf08fc28ed0b03ef218d0b0e127b5046a9b965d8287fc07d20d688150ca006c79be06c7fdc9bb7910613ff3b5ba73d67e8dd2657407b021cdbb78ea5106f1646e9fab0fe2816f78a750ded955e761ba85c819d46a9e2a5ff21cdfc247b7350b0f8ecb1b82b1f991dba6d8b1e63cc69d4a7da94a552e695c6ca72da158fdd2260128890e396f7aa3b62023deff2db64c9a39b6030e9b39d99e280a4fec1683e09bb3787305d649f7ebb7bec1c75b1a6ea0259b734c14a0a2558a99db4acabfd497d51adfa4a46fac0c29d21fc027f0488fb7a2952e576fc9efa0c6f3bbb9725ee8556fb5ab129aa3e3ce912b2df7fc3c15463f649844144f62493b9ca098c5bca1e14e2148aea9ef0b851400b32db71827c0b0b5f8347f36f3e78f2f165f8e3fdea653ba81865efca377df1273b6a1f5df53aada0cc162aa096083a8ff62f6bd1096861fb1aae2851b4e55feb071284c12c6993dba58a4e938ec33d897b5333d67da388a69569a5762165ac069b0f9c00cca0bd1139c96e8265c865c2f8e7c39063bc077f795749cb6076df4588e2b2d07853a1443fcab992c7be89857a004fa930864687868405f9d06cd44a0122e2df619de0c07ddb7bd136ef66b5a49f7c6251915d5361fbf75d8acc6471b2aec8c0d8499c78ea80511fe930ed6f8ff4406b5c061678c0e23dc998804dcd4c7fc166356e536d84a59bc35fd2c111c7aac8ac8c29f5310f40bf0161bc7950978b886f0ce03e2e053e0d426238e9401c126d362e59556ff6bbdd7886000b65fde3390be7c2e91df00f2e15bdf77fc84040f705fe1756c4402679479a18fea45b24ac145764d68c03b2ace1ad2a40c67b027b5a81c8e29ac5d69ea33c39e236c7f906f6a8445b7a88ddcedc5d7a5b3326e9192aaa4b13e12469a21b34c6709660dbbe4844ff9aab8c1af58a076ce7dbe92a63aeaa409de0aed0d76b0da0578f55c4d6cc5b77637710c3498c8cc4718da0efefb279511b4a026d613e50a3fa51401fc786f81708e619a9369b6d9d5daea06836850917d835304fa3d6dbb4dd72ac7e624587ec2437f466db42e2d5c8bb03eb389c0482c087b6c2ea1e81f13a0b3772e452c3d640583c9705267c10d4d5f88f8322d2df8a55ba2b2fd5c7cb1b905a0c2822bd46d86e73018d96953491224866bf73b315490b2cacc59a13c14ce68372fc66c6f76a3ad62c9cbf734bf90b44a0c04f2f7545d501c91ced47854b3a5d3773420c653558b73d3c59d7d3c1689db1782f2ef33fe06b7418229a34768351cf11f61eef9f3839d3e5530af4d089305a32ebd80c97223b67047148a36d8c3eca73f31f2d94c04d70e89173ee68501de0c945b74530795598204e145adc81502d83c2944ecc9a6c42db1d7cd91682e05051e93f714505d75c1553d85e4217ae2af8f40110cc1dc88a3b34653871ecc50420cedba771ff2502b58f3bf353d62b68c365f4c7a6603f3c2a238d3e98594f1ba6e1b08eada2918519a628a45ecae4b17fb39ec117fa16c9448fe1d21645120ba850e71e2947b54cf87c599a6a2827263640041367784ec51b9c37cdbb3627f76f21955d9876ea0283ed22b5a07cec34792d6f9dbb505184eec9ef7f35b8237fdaf2b05fad8d98ce61c635c10fb5d803f9096ed9c7205b421482557f2f7c6807df1f893568181371df13935446ce065beb87a55c2dea524b53c6d4fa06a7806e31ddd78bb4704c5764b66c793128a76b159d914f5d76543df761e1db72935277f57a7a7b2ab9e7fbee199d6b4638094cb89b66fbd8c82e179f53234e5abb6ec764690885115cedd1677f5c8b2887ad48de4af560fa3fdcf7350cc5e6b6b90a23541c6174d906278d63a7b850380c412984e8b16aceb3971f832e85ffeec27da4a05c46811bb9dc4f3693f6036a1fe551da2d57544f4c85708b06f137692d30fb2146cdfad11a65ecc4e0e1afa9f25ff22858b14efbec3557074fbbf067122a39370193dfeb1b41e38b24701506d64986a4cad8853a2a39028e29f46e08b4ea0a88d180c6762ff166212ce8280c6ae78665f9c70803a313030a3e69c41f93f246738e7d5f9862f9f1d126a5fa1d67b18c6a6480c8ee7f5f5b5d24740b6d55fb64acd9435b7d0b6e13abc83a76e075387f6b93296293815504948933d97c33edd95a62f0c28db4d179e49bafceec7973b5657285a7eb9420b22caad226aa8b055495eba5974a94b17f3c18928539f7f4b03e140aefb83f2d5c2b96f74bd2689ef465777f03672d0d744f2aa232e851e5da6dbbea3ab5948b65a60872de801be0665553d27f8b831cd1769bb4cd61140cec1c9bc6677091656eff149a9546ccd453beb00c4a1851f7a67921978c5ee2ca83cc84ad7c5687c556f227f97a6271f072cab034052b22046be0bfaebad6df055d007fc5d7b6cc63aacf4ec075a0e93fc4adf32819397db79d38193450e8fe88e8effb71030ce29e62d64497c1198f8190d3b8b25c8eae993fe86e3ec3519a7a56d533462bf20b7066894af483442d6145cd3702592f6ce789526904b9a916e1c26462338ce9dabbc4ced46be7db7203dbbb84a3bd575a5ce2a624141e7d57ee41481a24d9fce04a6597a376d843ec7f024393bfa4f043a3f0a0ee18c5c8d990cff3c9b6bd7caca182fdf365d03983d95c5bf21bd7cd1929e57817dcb8d82e932e9d4e293f7c7adbded7646c56728c99afde5bdd68e219a10fa986766ac55ba1f05e6e73f0ca5df6826258eb31d002bfd3e0500171cdc9f0dd4fcb9955a058f83b15444ec721c431b9dbf103c252bb34ff11e2eaf153ff5a061dc20f386297e36a7f3ca746aa3a135e479e0ba55cceedb69a7f7624fa975e048d763b3fc94aa7d96da972ddee7f91b7f00d6c1cfde389f4ab05c799aa106556611cd123a26ff6a23a4057a3b2ff2569dd14605968e76993965b7211c5b7405ff5c89cdcfb36283f7fa82ff1da9e26d0269fac8daf9015b93b3b536c5b00a2c7427e199d9807be9893b67f03a9a1970a1a046887e0a8dcf4e6a2cee57ff26b8a664f6c836b28b20082d0387e02d6d42adb8c5f126668c2292cda1123b85e39ffbd389d832138eaa1500b06f16b0d0e5505c970152194e30f8bc3a2ef01385533daec68f3246ef72956036ba3aead3d62e879dcacb7f505698c6687996ffeeefe7d2a0c3648968aec1e2b864a9b36b8f08211e8178883a27a079fe072f08ca49e5ef1ab910ff56ac7d4db6a0e25457c230cf920acad2698536ad3c6bbea096729e2687057b1d998103c0dde7df3d699a35e5b7a297dcae7d42dc5e6a138adada3247fd200f3060be71eaed95f6e17039650bd67ed21569598bba030ca1063affaef3ad2f17d74d33508a3c74b0a9a536a7c4109ffb9bd1e1ab3ea36555c2522f1cfad903c8a51e91cdff895146b56b83fff4680123b35a193c106e845f575c9b983e338793bddd57a0c46acd9298508e556d242d62cdb45e9c0f9bbdcce45a259ae0ffd57dfeaf85c64351e0cf392c4220a6d10c7e178ef8a88c4c1ad63c131cd92df268301730bcfc01f14882e51e9826b793fdfdf5f14ce7c44c59ed399e3a56ab3ede222dccd25736b85ffbf267efd69be2ad7e07a9b6360dcfee822e70f188722d0443239533c664b51d9d6bf46ccf8087116d5baf8dd6e0077800d84c309d7d749851f45d5f843cc369c00fadee5971af41f9451fdcb24138a1f19b9d3f166d6af9a4ac580b8b38c3ae8f0822640222d3563c611071c5ed0d370566ba597913dc6beed7470d7530b1b8ed213a3e6f37b15983e63f61de57cf0996250af0cb47c8c2cbe374678edd248d14f970fbe3c24a0a35a08b517af001b7fcf8cd9a01a4e909a1247600880a0db14025908498233325773bc70c907bffe93a537d60ef9590641987f23e28bf77550609aba6d5e1b13e79b1990ac9ab8b70e96ccf1c7d685606ea0194b40c68e3fcd64b3da521b770052221807de6c4186166a9d7efed120c978fcdb8380d5be361fcb52b5728831d367f29a8879a61d7eab88a95265b583c44068374cd3f26c23a1c62cf33b8f647c9891733ac9428d675510a6c9dfe5b0489c446a8601bd14bff6f637cb030b4dc60f8b17af638ac775a9339d7a4334cee79d830d735d3186adbc52e733f3fb410d20764d418f3863ed2acc874ca4be1aa47df5c24692638d703df3dfa0c7e7a1f3e9993b8f0e7607b4969532a97dcfd30531b19fc76c331b676881217067428c1403fce556557baeeb389b4146fa043d49680239df3182fa576d48c9d40492c78d029d149f1 + 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark{restore}if +%%EndResource +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 155.52 C +ski{/Helvetica fcd /Helvetica-ISO8859-1 fdf}if +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<54574542277320534f525420636f6e66696775726174696f6e20706172616d6574657220646566696e657320> 146.88 154.56 C +<636c617373696669636174696f6e206f6620656e747269657320616e6420646973706c6179207479706573> 146.88 183.12 C +<534f52542020746f635f666163756c747920466163756c747920202020202020202020352020202020206f7267207461745f736f7274> 158.16 226.08 C +<202020202020202020202020746f635f63656e7420202020bb43656e7472616c20666163696c697479ab2032206f7267207461745f736f7274> 158.16 263.04 C +<2020202020202020202020206f7267616e697a6174696f6e616c556e69742020556e69742031352020202020206f7267> 158.16 300.24 C +<2020202020202020202020202e2e2e> 158.16 337.44 C +<202020202020202020202020746f635f70726f6673202050726f666573736f727320202020203239202020202070657273> 158.16 374.40 C +<202020202020202020202020706572736f6e20202020202053746166662020202020202020202020202020203330202020202070657273> 158.16 411.60 C +gr +%%PageTrailer +rs +%%BoundingBox: 18 18 555 759 +showpage +%%BeginSetup +%%BeginFeature: *PageRegion A4 + a4 +%%EndFeature +%%EndSetup +%%Page: 10 10 +%%BeginPageSetup +/#copies 1 def +sv +90 rotate +1.00 -1.00 sl +18.96 18.00 tl +%%EndPageSetup +%%BoundingBox: (atend) +gs +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.72 537.84 t 66.72 25.20 lo 66.72 25.20 lo 66.72 537.84 lo 66.72 537.84 lo eofill st gr +gs np 66.72 537.84 t 66.72 25.20 lo 68.64 25.20 lo 68.64 537.84 lo 66.72 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.122 0.122 0.122 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 68.64 537.84 t 68.64 25.20 lo 70.80 25.20 lo 70.80 537.84 lo 68.64 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.247 0.247 0.247 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 70.80 537.84 t 70.80 25.20 lo 72.96 25.20 lo 72.96 537.84 lo 70.80 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.373 0.373 0.373 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 72.96 537.84 t 72.96 25.20 lo 75.12 25.20 lo 75.12 537.84 lo 72.96 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.498 0.498 0.498 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 75.12 537.84 t 75.12 25.20 lo 77.28 25.20 lo 77.28 537.84 lo 75.12 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.624 0.624 0.624 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 77.28 537.84 t 77.28 25.20 lo 79.44 25.20 lo 79.44 537.84 lo 77.28 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.749 0.749 0.749 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 79.44 537.84 t 79.44 25.20 lo 81.60 25.20 lo 81.60 537.84 lo 79.44 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 98.88 lo 66.96 98.88 lo 66.96 98.88 lo eofill st gr +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 100.80 lo 66.96 100.80 lo 66.96 98.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.110 0.110 0.110 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 100.80 t 741.60 100.80 lo 741.60 102.72 lo 66.96 102.72 lo 66.96 100.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.220 0.220 0.220 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 102.72 t 741.60 102.72 lo 741.60 104.88 lo 66.96 104.88 lo 66.96 102.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.333 0.333 0.333 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 104.88 t 741.60 104.88 lo 741.60 106.80 lo 66.96 106.80 lo 66.96 104.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.443 0.443 0.443 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 106.80 t 741.60 106.80 lo 741.60 108.72 lo 66.96 108.72 lo 66.96 106.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.553 0.553 0.553 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 108.72 t 741.60 108.72 lo 741.60 110.88 lo 66.96 110.88 lo 66.96 108.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.667 0.667 0.667 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 110.88 t 741.60 110.88 lo 741.60 112.80 lo 66.96 112.80 lo 66.96 110.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.776 0.776 0.776 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 112.80 t 741.60 112.80 lo 741.60 114.96 lo 66.96 114.96 lo 66.96 112.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 494.64 lo 94.08 494.64 lo 94.08 494.64 lo eofill st gr +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 496.56 lo 94.08 496.56 lo 94.08 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 496.56 t 395.52 496.56 lo 395.52 498.72 lo 94.08 498.72 lo 94.08 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 498.72 t 395.52 498.72 lo 395.52 500.64 lo 94.08 500.64 lo 94.08 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 500.64 t 395.52 500.64 lo 395.52 502.80 lo 94.08 502.80 lo 94.08 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 502.80 t 395.52 502.80 lo 395.52 504.72 lo 94.08 504.72 lo 94.08 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 504.72 t 395.52 504.72 lo 395.52 506.88 lo 94.08 506.88 lo 94.08 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 506.88 t 395.52 506.88 lo 395.52 509.04 lo 94.08 509.04 lo 94.08 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 509.04 t 395.52 509.04 lo 395.52 510.96 lo 94.08 510.96 lo 94.08 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 510.96 t 395.52 510.96 lo 395.52 513.12 lo 94.08 513.12 lo 94.08 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 513.12 t 395.52 513.12 lo 395.52 515.04 lo 94.08 515.04 lo 94.08 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 130.08 497.04 t 130.08 513.12 lo 360.00 513.12 lo 360.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Times-Roman fcd /Times-Roman-ISO8859-1 fdf}if +/Times-Roman-ISO8859-1 ff [13.68 0 0 -13.68 0 0] mf sf +<4b757274205370616e6965722c205a44562c20556e69766572736974e4742054fc62696e67656e> 130.08 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 494.64 lo 411.60 494.64 lo 411.60 494.64 lo eofill st gr +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 496.56 lo 411.60 496.56 lo 411.60 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 496.56 t 571.92 496.56 lo 571.92 498.72 lo 411.60 498.72 lo 411.60 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 498.72 t 571.92 498.72 lo 571.92 500.64 lo 411.60 500.64 lo 411.60 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 500.64 t 571.92 500.64 lo 571.92 502.80 lo 411.60 502.80 lo 411.60 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 502.80 t 571.92 502.80 lo 571.92 504.72 lo 411.60 504.72 lo 411.60 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 504.72 t 571.92 504.72 lo 571.92 506.88 lo 411.60 506.88 lo 411.60 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 506.88 t 571.92 506.88 lo 571.92 509.04 lo 411.60 509.04 lo 411.60 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 509.04 t 571.92 509.04 lo 571.92 510.96 lo 411.60 510.96 lo 411.60 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 510.96 t 571.92 510.96 lo 571.92 513.12 lo 411.60 513.12 lo 411.60 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 513.12 t 571.92 513.12 lo 571.92 515.04 lo 411.60 515.04 lo 411.60 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 456.00 497.04 t 456.00 513.12 lo 528.00 513.12 lo 528.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<31382d30312d31393939> 456.00 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 494.64 lo 585.84 494.64 lo 585.84 494.64 lo eofill st gr +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 496.56 lo 585.84 496.56 lo 585.84 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 496.56 t 740.16 496.56 lo 740.16 498.72 lo 585.84 498.72 lo 585.84 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 498.72 t 740.16 498.72 lo 740.16 500.64 lo 585.84 500.64 lo 585.84 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 500.64 t 740.16 500.64 lo 740.16 502.80 lo 585.84 502.80 lo 585.84 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 502.80 t 740.16 502.80 lo 740.16 504.72 lo 585.84 504.72 lo 585.84 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 504.72 t 740.16 504.72 lo 740.16 506.88 lo 585.84 506.88 lo 585.84 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 506.88 t 740.16 506.88 lo 740.16 509.04 lo 585.84 509.04 lo 585.84 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 509.04 t 740.16 509.04 lo 740.16 510.96 lo 585.84 510.96 lo 585.84 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 510.96 t 740.16 510.96 lo 740.16 513.12 lo 585.84 513.12 lo 585.84 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 513.12 t 740.16 513.12 lo 740.16 515.04 lo 585.84 515.04 lo 585.84 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 656.16 497.04 t 656.16 513.12 lo 670.32 513.12 lo 670.32 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<3130> 656.16 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 87.12 46.80 t 87.12 80.88 lo 741.84 80.88 lo 741.84 46.80 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica-BoldOblique fcd /Helvetica-BoldOblique-ISO8859-1 fdf}if +/Helvetica-BoldOblique-ISO8859-1 ff [28.08 0 0 -28.08 0 0] mf sf +<44796e616d6963205265636f6e66696775726174696f6e206f6620446973706c617920506172616d6574657273> 92.88 73.92 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 215.52 t 107.04 344.40 lo 741.84 344.40 lo 741.84 215.52 lo +cp clip np +0.000 0.000 0.000 RGB +%%BeginResource: font StarBats +%!PS-AdobeFont-1.0: StarBats 001.000 %%CreationDate: 09.09.98 at 15:50 %%VMusage: 1024 36745 % Generated by Fontographer 4.1 % \(c\) Copyright 1998 Star Division GmbH % ADL: 917 200 0 %%EndComments FontDirectory/StarBats known{/StarBats findfont dup/UniqueID known{dup /UniqueID get 4092170 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 20 dict begin /FontInfo 16 dict dup begin /version (001.000) readonly def /FullName (StarBats) readonly def /FamilyName (StarBats) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -133 def /UnderlineThickness 20 def /Notice (\(c\) Copyright 1998 Star Division GmbH) readonly def /em 1000 def /ascent 917 def /descent 200 def end readonly def /FontName /StarBats def /Encoding 256 array dup 0/.notdef put dup 1/.notdef put dup 2/.notdef put dup 3/glyph140 put dup 4/glyph141 put dup 5/ch5 put dup 6/ch6 put dup 7/.notdef put dup 8/.notdef put dup 9/.notdef put dup 10/.notdef put dup 11/.notdef put dup 12/.notdef put dup 13/.notdef put dup 14/.notdef put dup 15/.notdef put dup 16/.notdef put dup 17/.notdef put dup 18/.notdef put dup 19/.notdef put dup 20/.notdef put dup 21/.notdef put dup 22/.notdef put dup 23/.notdef put dup 24/.notdef put dup 25/.notdef put dup 26/.notdef put dup 27/.notdef put dup 28/.notdef put dup 29/.notdef put dup 30/.notdef put dup 31/.notdef put dup 32/space put dup 33/exclam put dup 34/quotedbl put dup 35/numbersign put dup 36/dollar put dup 37/percent put dup 38/ampersand put dup 39/quotesingle put dup 40/parenleft put dup 41/parenright put dup 42/asterisk put dup 43/plus put dup 44/comma put dup 45/hyphen put dup 46/period put dup 47/slash put dup 48/zero put dup 49/one put dup 50/two put dup 51/three put dup 52/four put dup 53/five put dup 54/six put dup 55/seven put dup 56/eight put dup 57/nine put dup 58/colon put dup 59/semicolon put dup 60/less put dup 61/equal put dup 62/greater put dup 63/question put dup 64/at put dup 65/A put dup 66/B put dup 67/C put dup 68/D put dup 69/E put dup 70/F put dup 71/G put dup 72/H put dup 73/I put dup 74/J put dup 75/K put dup 76/L put dup 77/M put dup 78/N put dup 79/O put dup 80/P put dup 81/Q put dup 82/R put dup 83/S put dup 84/T put dup 85/U put dup 86/V put dup 87/W put dup 88/X put dup 89/Y put dup 90/Z put dup 91/bracketleft put dup 92/backslash put dup 93/bracketright put dup 94/asciicircum put dup 95/underscore put dup 96/grave put dup 97/a put dup 98/b put dup 99/c put dup 100/d put dup 101/e put dup 102/f put dup 103/g put dup 104/h put dup 105/i put dup 106/j put dup 107/k put dup 108/l put dup 109/m put dup 110/n put dup 111/o put dup 112/p put dup 113/q put dup 114/r put dup 115/s put dup 116/t put dup 117/u put dup 118/v put dup 119/w put dup 120/x put dup 121/y put dup 122/z put dup 123/braceleft put dup 124/bar put dup 125/braceright put dup 126/asciitilde put dup 127/.notdef put dup 128/Euro put dup 129/.notdef put dup 130/quotesinglbase put dup 131/florin put dup 132/quotedblbase put dup 133/ellipsis put dup 134/.notdef put dup 135/daggerdbl put dup 136/circumflex put dup 137/perthousand put dup 138/Scaron put dup 139/guilsinglleft put dup 140/OE put dup 141/.notdef put dup 142/.notdef put dup 143/.notdef put dup 144/.notdef put dup 145/quoteleft put dup 146/quoteright put dup 147/quotedblleft put dup 148/quotedblright put dup 149/bullet put dup 150/endash put dup 151/emdash put dup 152/.notdef put dup 153/trademark put dup 154/scaron put dup 155/guilsinglright put dup 156/oe put dup 157/.notdef put dup 158/.notdef put dup 159/.notdef put dup 160/.notdef put dup 161/exclamdown put dup 162/cent put dup 163/sterling put dup 164/currency put dup 165/yen put dup 166/brokenbar put dup 167/section put dup 168/dieresis put dup 169/copyright put dup 170/ordfeminine put dup 171/guillemotleft put dup 172/Tom put dup 173/Pete put dup 174/registered put dup 175/macron put dup 176/degree put dup 177/plusminus put dup 178/twosuperior put dup 179/threesuperior put dup 180/acute put dup 181/mu1 put dup 182/paragraph put dup 183/middot put dup 184/cedilla put dup 185/onesuperior put dup 186/ordmasculine put dup 187/guillemotright put dup 188/onequarter put dup 189/onehalf put dup 190/threequarters put dup 191/questiondown put dup 192/Agrave put dup 193/Aacute put dup 194/Acircumflex put dup 195/Atilde put dup 196/Adieresis put dup 197/Aring put dup 198/AE put dup 199/Ccedilla put dup 200/STARling put dup 201/Idee put dup 202/nbspace put dup 203/Edieresis put dup 204/Igrave put dup 205/Iacute put dup 206/Icircumflex put dup 207/Idieresis put dup 208/Eth put dup 209/Ntilde put dup 210/Ograve put dup 211/Oacute put dup 212/Ocircumflex put dup 213/Otilde put dup 214/Odieresis put dup 215/multiply put dup 216/Oslash put dup 217/Ugrave put dup 218/Uacute put dup 219/Ucircumflex put dup 220/Udieresis put dup 221/Yacute put dup 222/Thorn put dup 223/germandbls put dup 224/agrave put dup 225/aacute put dup 226/acircumflex put dup 227/atilde put dup 228/adieresis put dup 229/aring put dup 230/ae put dup 231/ccedilla put dup 232/egrave put dup 233/eacute put dup 234/ecircumflex put dup 235/edieresis put dup 236/igrave put dup 237/iacute put dup 238/icircumflex put dup 239/idieresis put dup 240/eth put dup 241/ntilde put dup 242/ograve put dup 243/oacute put dup 244/ocircumflex put dup 245/otilde put dup 246/odieresis put dup 247/divide put dup 248/oslash put dup 249/ugrave put dup 250/uacute put dup 251/ucircumflex put dup 252/udieresis put dup 253/yacute put dup 254/thorn put dup 255/uni20AC put readonly def /PaintType 0 def /FontType 1 def /StrokeWidth 0 def /FontMatrix[0.001 0 0 0.001 0 0]readonly def /UniqueID 4092170 def /FontBBox{-12 -210 1083 917}readonly def currentdict end currentfile eexec +d8061d93a824650eefe2785f13cd28a8a226cfb0a1a9915b91e00d2c2cb80ac548a1ab21bed4518a56748942842eff6121b01bc269e7837046266cb27dafd3a4fd0344e68245aa98a5f1b5bc9db554ebffb879f1c082989cf6c044b76f4814df51dcd03f9e3397f3c73d94f85771983bd52fbe6ecbcd9a2cbb7b3636cfb819daa5469925fc89a188732d68c6d06c906d183cb4bd495aed0c41fe6b7333ad90a1674478062c8996476573a0cdad62593c86e4741ecab7b8c75a6bf02971dfdc2c5a2e1c8f74ab1e91315c54e72426da3a62dede611d5967201fe8bfaa5a21c612c0b245fa35c6706b7b9aa3f73ce16604e3109770d367fb30fa663aa8d2b246de733d27174a0b818d54c58c3676435d43949eb9e5e335396296bc3f096fc154616c0b723b0b4a100ed45072f371f77f26e02f1dcc41376638097d79af0a4ddbfc37dd6cb60d0d34ea5a7536c655d95549b8a5a269e7e927c3d89f74b88e17973c2e8d64688089d329abe6b1009c0334d57a6dc34f22efdd933023231fa03fc81093ef255a199448f17d8f67dbc57c38b2fa163b8cef97a6f42e74af55319eb81a6fb9de18810ba9e3659a7144b80aa066a9f386de3030fc4985efffd13c0cab7049a09a71dc1dfa21a1540f4289b13dde08c0d3b4a01fd2bcb4e256b398c94036935bc270713a24c51042bac575ed4827e17e5dc2997753fcee0ecaaca582c85518edc0c3dee2851fa4d2581f7b399f07013ca3d1d4702cc27be134cfa8aa1cbfecac76f1b406b5b3126c3b7b60ec34340aac6433997656b3dcc1af6c8036f051edfc109a493243546721683fe5c0e48790848079c74ea0640c3f9c92cdd22fab8af9b5575a5d1d2cea0f1f715505cb02a1e200cbe4ea5563d0475cb13bda929286f9c11eab10ddd676314996954ae3c94bd14f364d5202e6ddd20b1b4c7abec1c061b2d8a1776577387a2f2dc424f56d44e58b96f91f7b871627089498d76bbc6664e1ebc9b26486cb727d4a5d62fe405324ceb0a5dbf51c9619f2913e4dcea44c5bac49d74bd049f28b83955e13f0fc77d998a307b0bb560757b21e4a982b59cd5723d66952b8a7ad0311ee6874842f454046538c475b86983b4b8d9c00e814009235a058f6d5fca9e8339555518ba2b64ee925cf0944deff5c14069a1ee1de2cadafaa6421f495c21c042690b3a7c9e6a5a137ee005240308e63e0b1d4bead90ec607d19c57ecc24c2ea9b8ed4af8e5ec19575ba230c19156ff9b23915a7b50666ec4b655a2946f97c5013cdfc31825f2c1040fb28bb8876b1accb1fc005010e5e5d061651dc9df17b7bb37c495a37df9659962680951290f3f4168dffb294f83b2a3c423526a97451e2504fc0c819f4d263834ef7c8588ea4d68c98eb5e3ee3c2de20a6da219b3256400a7c745059581d33158a505d5bb07c75bda324c2d8fe34eadb98520c7b82838835e92ddd1d89516478cb1ca795324f802e1f7a5547f671588fc3e5b909f5ab9d573bb0766569a36e89586b7410b76867cad6577022e9be567d1a5578361d83b817fb994758c679fcfd6b22c9fa7c6c76f2a72be566e42167247c831f826d9a10e03874b9747783adece88750be1206a07923cd9fe06b677b61c69a7dd9e0f9dc60771ac529f6adaeee9ee6652cdeca5789c7f242266d86f0154a1984402c720adbc3dc79b6eece6d378555d78873844ba1cf057f385e70474132e0bdfabe169a631e07d12fd21f18736013499081e58d72e9cd451df304a5bf52c1f1723a5ec8b7992d8fa3f33d5be97d4c114fd435a94607f8be09812bc1fa4db028644e2fcef5d86ffb947a14993a93185b054a7cd9ad734c62f2d9ce3c0f9e2e8678bae5b92315f60169aa85d4ae22488cfab72b841374ac3f39966b9e126ad64c0307b54085b6e25d51caef51fecae4c5ddbfb5c29b15cc90ec0795123a84d3c31173b49096d617707d9e192da82493ac9884759115c02ba4686ed464d523aad69167e24e5303ac3eb3da0eebcc420fdc256cc26d466f979c8e637344958f02ba9d3a481693fbf13283d7d276af546abf2f2bb4e6c6f835c97e532bd5b40e8b08eea4441e8a9e03021add36c4fe28180ea466082e4fd7facb03f7abd47c929c4e0d84132835e59f8276ac7fddec7755cba924dd1c97e02691f13f2e159b1e358ef2ba347e2298b0b39f5ffdab57daae22d94ba5064abf716c866b64add8e3981b76a77a3a8be0a462594b9e1257e7940b237875e000c0e23a0841a85da6eb5af931dc0ddfe912285d160f12a66ebc8717fd37c13d20cc132218d31680d596ffbbb2f2805fd931c61693bcbe365f0d19c8fea4ff3eceefe09c5e29b7fde3782b8adf4bb1aa7f89ce01fa59d1322a1ccc4d92705e274bdc287312b23ab830968143efe12c8d4ac45e0c72c11f630eb5ae0c835b7f7d32cf261c20f04b7df8e362cb15cf38c531a3988afc8eb957fcee0364049ccc8d8a6935200970293486bb69db1969a2aeb39829cc4bed803e0c266c77b0dffd349ff9ae8f95558a3977775b1bc2dba5be54800a9e9645155315b062d0b5a0491cf90a66e84b581070f30d5796f71e88db0352432e8df588d25c9c9b2dd12b976618551d5625e357737966d9a15fe3cd9d54bc275b6f5993ecfcfbb373c419e2f8ed32fcd56d30db1345987a445ad259e03053244a1ff80c9343538c74845a907b0480f013289cf475df6c989a81aa5ba904a63db328292553fd4fc3a783fb76ee6ae50be4809ea0aaac9a9ba429c9990eb45affca8587972c54fdd677cd14f81404c77e4358212f44826316a927983c968767e7be1c7a36f308b6cab1648780b4f1a568cbb0ea49f6a6352d6ab18d54d442c176037ad16e18a17d88cd8fda7e86895c89368239f0f75f8c26f850316a328c40efcf316d8829ddb0fb69b250e41b94144e0475acadf63e51f27f6ecb6af4ed78ddce68c055b7a1f78ec1174bf9d67f54838da11655980a909ae1b80a2e6282137c75e49d703e6d5b4be616e62b020a8d08efd14912337a75857920f1d3515ab2771d38d8d8f610c9801d0b0c8d3388c75d211ac4e4c0c491d3b70e1bf1b926a6fabf60487613e76e6f779c4aed60929561ed06c676de7d5052f60db62e446ca4e2775b966f74a2ab55466ecac93c65e48d5e6b88080f24534ca63dd1e6781920be3010f3e9ceb771c5509754ebf963de75b4b9c9116ba7f4e21d9d89d2df167d8c5674b2fa61f49f016b4269e602c6e144de4a382fb7f185dcd82942081d6362f335695587d2ed1071a70bb27d51200a1de03763bec6b2c7a86d8f200505c07f25fc6be9c044110607154cb69efcbfce495dc86dc634e20349712d3754ce99a8b33cc59ce272e39f481b729c878399e51976652b4a525d107ebbd809909ec95f07f2012672601eb9ada5e0b3292d68b6ff8d529a2dcd23f7150d77ba5b1a36701d5954d37ee96501f9efa8e037290f6dca8c024ec0a2ced95b8dcbfea0ddc55dac8ffa55e224d33fdae74502f8f0085fdb5d6d031d34a609db4ed63ceeb285f3697049800bd560e31bfdc6862a49da0ff4b4e84bac9f184e08181c7870058559f826977e851f7dde09163b8b3cc82be8103f7baea3072202ffce888f1bbe37cadb748e2a3b3b53cf38b4336a4eadd0afffd76389b1dd9d067888c4e647b07a7643b81fc08a15872f08f6295eb45e7838021253432f2bdfca6c2a85aa70efea06863d3ebfdc555f41abceb6fc1a5f92448e917ae97706dc04adf0b7bc817c1b93d2f924b118fac5fe6053093401a4676c6d7ce7b4ceae1f5c149b1d8d712d32d56bc8430c210a7124e192e387ed9696df38ac2763e3a065c3ae4726afe9c16b07891bf5243c16add2bf494f9ae8b7566d4ee600a7fcc945d4bdd305daf4df51b1c0222e5594c65af003b51549e0e790ef194943d4accef39419ba173d05788ff822d4e3d4fb5a612fb13292aa377e50a44a6953bb793d0c521c2179012a882b74ece2f79723fb75624ae9c446ba358a3effd738ccb59a856f1bb5afe8635e1033936d58da18ea1f7464758e4647ac03552bcd1be22ef9d4c0f4aea0d7d1c91234ac50d5192bda73b0e63a8303ee284009e6f42c0a8671cbac1c02ac67f096cdb67e83a8d3a8b0e2915fe4e498d50a80892a374cf637cbdc145c2a4a16e0449fd300f7f03b9c80b320addb404d3b7388e5473a6502c74a9d614b21f2526b2e4f9fd9c5adca0f01677b57de5a55d60d9c428c6833d7abb14514926e09bba6b07763aad75d0a934b7c44976be43c289fb238aeff7556183515a5c4b085447922adff5498d29e101a60ff02e893ce8fb8d446874914eb3d3009db46a579d14dfe884d22d9ca5bfde436f4bf334c8c8e73cad66d26b9b711b3a2a3ea84d6864945e529bf59d397ed0acca03a3bb32e470c46cd6639cdae83b4e8e6decd2e8574e1b9361e2600bdccd6c9231ddb2b5981f4148984e0d21d2bc7c54fa7b32144192d32a60bb17520e855b14ea6ba31068d4e209a5add8dd6cec44932063adac2280f985cc70099a1fffb3cdc3134604bb8e50ede70ce9db412a309a21a0541662050f545cf6f2fbb39e9106e83d34dd1a7f9f08b66e68052482a68778687aac8b793ca24cf3d258d7991c4d2c0eb760d1b83dec08277bce87bef9883ff7af63a927a509eb44ffdf2f8f2a529baee6c68478a1f8a10c81fc3fe0a88004843f05d15b34d04149508d7b29ff2b11ad5e150269dd78545f0f57ca1752f6197a8539ab3aef587645b5dda3dbf18060d30c3426f2fff04d9bf22f1591762597d72cd6225f01377293696235f084801440fb9590bf6468e73c11d7de5c7c9899d6a84a9bbe18c8238e117ae4e74ce9c087957935630399f186f4712caa2775ee026f1c9f334bfa2ea897f2cef8f6d2f200bb2fd7d9292c056149cb3091d54be657c5efb690dd7290b7f866330d8b64cdb134019ba3c608bebca348fac2ee3891d54ce18d427de0e8270ca0b19b5cb9ab69ff7bfce6b5c6431fc794f1a2ae04975dfca6d865e38a85d0092b339119f43ee8f11f999ff0132145ef65f2786d9dae9c45dff0ff2195bfc604db64e4da4b681dcb6a3e2be4f691bad02abb6347e7ffb00172df452182679d10029a878d14569825c6df61c229e158f92a6a0e0590722313729ecc3c93a9de9f044e62d3abdf500ea46557e90649aeb8cc582bfb6fa71042b330800d50aebe27e1b7605c3aca1f67c4116d93a1d59d7f9a9d7dacb2c949193b0e901291474ed0f6b746c680b337ccc6adcccddfee2ba9e31f588940931c6d697222b14220ece34f97d640f78eafe33d689d8c5e94ba3eaccb197728d58924f1325c5951246898b2477057915ce4caea524151e7f3cb049441ae88014b89fe7730eed66c4161b2e01d608d977d674edd37527433214b40081ec8a262da3f69f07dd54acc3a8dc5058a927bf7ac5d3ff18e0e526cda9eeacc331cfecac11d2bec5872fdd5cff5f7459a42f263304294b139fd7106149b962873b757a2db3ee8e030a8ea3af3366fa5f3226d9f9de3c48dcc0f701ac74385d2b753e655804a834456e17ee576872bb5e9815bd6ab6a4555ce5fdcfd0b1637357424813dfa6443a46200dbcd46f7a15d342c14e5b99c1e53953283d83e81311eb2537162005d2bc0f18b336e33f7190d4cc4ab8a86f596ac2522b6fe3aec0befaf024e35f811a309c8a03734e432ac4695d977d6fc14c93773edfe0eab4b5a0a6d55b4ccd205086b92107a434b119d15f145d0f3511f823e69a4b3777b659555f06116cd99075982c200e36eff85d7931c7b918af5504bb4129cf65c8a33964b3b6fd3b2340fd3737c73f7667632cbf81535b88096e99a5e98ffee00409948eb2b46010a275ffdf345bc0e359ae4c2b6b804a36ec5018db1ddfd43ed28e0982be3dd61a41fc78221bfaf4eea3c94e8819e2d296a355bf61cc29ad69e2baa9caa77f4587be6bccfb178d553bb99bdf52716e6a8e2626505b819cc595f5173d13340fde8dbb4db3313a66348c8cf5fddfe7d7fd04becc8fec0ee1385ce5329088e772f1939fd59e2dce71c2946044fdcd131e06695ebfe5ae6e512640d0ea79492c20880391bffb1b3c9851cfba1b5b16d5860baa2a2b1f4e0a571aa3551cd73256e171c2590687e3596108defc56ca6cefb27095380b0bfff828d897c5f4a1f7710cc1fbe37ce9254c27edb772093e789a7e2a941d676fa8f14edf641dcb06fbd638e74a3764be77ccb7f93b5f961be59a6df0c5305b6ab3a20ead2d3eadd749fff40762a25833c9efbe377d2aae40b18e7785a77f9eb4f05f987ac7572854859f5fc5f56240e94305543baf5df3fb905a1122d20d09d7133923783f4d1e30ce9bc990e1d4989280cdcae75b5a78ff48ec68254373f9a57663255c0d5a18bc78b3cf2002befdf0cbb3cb5e76243b963e16ef7a34a06016dbd728117ed141ce213dae5acc96930ef9320938084dec3f77ee4e595b496648896de03deef6fcf49f6477a04a0b190fa668ecb8dec555db55d7ba7d0151042dd4f205e50f53ca706d93c9ae1b67b51989ad1b3ebb27f2416588397429d2129bfe0d5fbc7888fe0ca49754024224ba6fbd089214122d5c5dfacf7fe314c34581b80fe2f0786f7a70788a1dc27bce9f69daf04f197e9fe3f735a339f6f88067636e23559d1a02cd1d8b70fb07146532a5b404a4491d8650a22ed0f49088e86054e76656f079074ae121f5039c5a128109551c3ad7bfb874de16f639a82f0cae1ba1e26cb21bb8ab0ffd0fdda61da950d00e9a9d319c32757cceb80c07716cecf71f96dc167d760bcb54c8c41387d7fb8b5f884a0f7f53acced99690e1316a8f2005edcce538b3b511a637736a08c932fe9f54e281535c9ebe5716228cef9648813df7f0ce70b5107833eb4025e11f93aa574ca8215ce3dc6a5069f03f22a2224d9d2f8c819714b3b02f32066785f9aaf616afa69a3c031f1d1ece51d541f60d6b8e739b63b0f6472b93e5e34cbca3474b47deec1d72ddf91baaafa42078c177469e8099ef4a80758225c7839a0ba643dc3c88fb01ca0f278f077675f0f3bf3319931f129dbd9ef04dd0daa8cf8bc6573b6b2091b64326a366df67a739f27f8c20f47ea3bea9a9880b0aa3b558c56f6596b0f51b124b78b717336142cc03823f2d75c0ad84c09868cbd0dcfae4ccf37b345a26d5e08b20c36505447042ee2ce81f450a835d7e0b679c0c9eae37ef6982001a8c52708c5db0ec2294a90b9876eb789ab09af859a0a879cc27d2f52dde9e9a6960fca2530244cc26d3a21cb294458d707dbe2441460d79d1783fb334a3d144339bdd635b676a1b260f5969bf089d59a526f56bdcf92bbb2d52cb268ccca6c66e4ceefa57c72cbdf8a4e1a2b57ff356f8fa49db680fdbaa3d4df9f1d6201307a44a9ebef9ab8c893518d71beceba645d6df155f6aa68163f8d66b40c1084b673ac16b287f763d40db303c4c9f9e76a3e8fff77d595e97f7e59e56b02aa8f005d0c6830931892207e25a11520efbce320b99362de47e093fdd48318cef9458ab6b4093d1480ab1424e82695527412d0c5e3c299eac02b67ee503a9d04d31431d172f50666fa59e778dc43ffb7eb3f78324a5cd88601f7109bf3bc03f0256ec90473715c9a626a8488a4ac0403438c7fb97438334506f3718c262c6fb671cc1501e1616281c50c1f1abb0e796b5a989d9419e9146784619689562ee006255b58c5030d4deb7bd4e723d5dddced22c58905adb6a1b319ff10a8610912023c965c87e8b9f50babf746950ca2b356c1a9cc1cb8180a3536b2a639a147f65a8178fbe711c5fffb8fba62069c74e02ee7bb219bde7f581ed080e33ada55e37013823fbe5eaf8f7b774209a75b047e7626b8b82733f525e57792ca6c79bd882c5bfa323fc5ed98227c892ff958a359fcf654cb8facb6827d717a899ab9b4d2093e7a3762ba0c9f7ad55124173a5bb29f9f8769484f698dc8f8b394816dd74eff3b1a7dbdf16096bd0ad1b5bd409d56783b6d418631be43d241d6b834e1e8107bd9e296f9aa43e90ef753d6ad527875f230f6b1d3914692840fd51e8048ef5ecc8e7d2da90645c8e0acbdb3803d677cb07714a5fbaf0caa48234e6abfd0cc1be8a80ea7e956ec40a54ce712c979d9d108c28566d3c71c93c25fd7c202c637aa06f1baa00ed6262f87062cbc03e7722983a7c87645ad8d6e0df84112139cd220b03e3b874dea9b9705efa254db06927ab7951eb72ea84b253e0bb877b77fb1810b078ba9f20280d7e85fd9d134ee7166cb1cd51525a5bde7cf96b26569af11b40dbf5b4b25a662c9e14dc084cc349bf451cc976d1de3ef735d001c18d7e6027fdba88d29016ba395ab7f6b1d232151acca1ee234a287c2d7843223db3df6e3e5325a9fc82d92b0baa4a28fc927a3c3d307f7a7ca1ec7a54e8b4a56c177aedb633425bc7676a10c0c2d51b5555f4757c2c9908cf39eee8f85913216c5df40fc6a04dc460e99f55844700b4e02ef7a81ddf4bfa798e5ea327d2c66db67c608afb6ea5753ade25c620d52a5ff2c1d43385737d41e7e6cc645b1f9dffacdc0e8cf72a9128abd66cfe77f2c273e7efb2c6d3ddf4848a023911b7287797cb7a3baff8df5f4d8baf2d30d8ef3daa330fe4728f2fc405bf82b6360d1c9f78d17fe13bad721756ec2bba578702ab8a41c094b22a2ea393e9d4d597e5d0c2f12ab5f21d4546ac61e0b96ad5bc47586bd42edd8caf964cd2b997e0bd816ffd593d5481a8ab543384f8090d7cc0d9d4dba9001992366bbd61949f2b33bb6633f45554e879ec6399f11a13be5d195c927f9e4fb503c2f7f1af69725add00166a3c6f0b72230416d09687ac6109eb06d16b8321ab293cc112cccae7bd8233a6206b814694eb0057b708a76f7c793115dbd09b6b6808cddd0dccbc2a20c5abd02a91f0846ac0856a5cf7be1319057e48631937a3bfff2d24f0fecb55e929c1c7d8dfddf2fb892926e20c9fe4a84bc1d9dfd203d438a7f989ba23836bd55b1089bcaadbbbf19e8cf001f75059a1dc3daace5ef08b0b55231f3b63ccbcb50805601c86e10e48f90dbae123b55d421df8301a9c67f4cdead045d1ace302b93f9337ada9ed3ea36369cf35577e868383d69cd425ece04e0cdc1940b296c35e1314d837d6fa900d661eed125ada136ae005179a03494e23a245d96e60cbd7a04f9503c227e835e58935e28bdba5446128f0db08dcd9b85049c5c67e357a3a511f37a71df23c25f971df40b9982b1b5ab845bd4870fbcdf4ea319afa2e225dcbe3b4b06b73429467ab402aeb48e3b661a0355cdeefdb754d43b66d1b576a1ec93994587b16fef1d493d53263ba10fae3dd01736b479e33dcf87dd9af58b353bc55b8a5382aff065773ca8e932d8e55a80537dc04193176a1c38082e3d4fbc38ffbac68bfcbd80ea1682b79961ca070d3f7938571303267b2be5afc70f196383a01fabd8952db19f7c5921fd66ef6f44523adb1bb09ed0cd03c14b8fa91b088ecc5152d6e288f2f388b5870733b489081581fcdc2e1483d3a2dd9b1bfabe1732b2ae37041d49727a2bde007820f328cc2118b610793e6a6996e1f336a061eef6b61120049fd0b9f0847409cb3a8ab404c563c1769de2660b073dcb30bb916f3679b5819958ce2f5330634e2361cff5c0915861ec791b0dedf34a845103f7e1041a366e6109b88bcdfea2e0d0d260f16717d67e20c9a0b624f15f1f05339a408dbc7fa3b8395895bf50691bbeaccbfe69bc22e136a37fb9d074d668eaaa2f98af8ee35119d46af0dd9939462cfd2ddeb85792ca7d38d61e2c5109d2c91fc8232503900396ae6a85b7a88c80136699e77c0d7408eb88538cc544a3db250e2bcccbfa8076d70b026d46cefa250c128f8ab95d1ed9f028d56b01489d81da013201747b80513f318b84fca9dd1c4d65f36a82d09d847d550e1854341338456714e0a93424e6146e34994f84cc6bee325ae41d716920dcc0bfec62368546c901a8d43bf94c9bd2cb56283888ca54b758135fbff776c9fa98d50271b172889414b7e948180c03700d2cf3ebf390f0f9c8985900a76be9171f7439c60e18a0db5a46983722ff1489f77d24f2112b9035e65cfd10fe4c560426e464b6759ae5f24116d16f9a3167eadd85389114535f44f8054d463c1b8bab08779d40b74ee854aa6d652aaf40c30d63622eda14aacdbc002c0891abcc764b676a3b049deaf49d6789c7f9cb12bb6f0d1619548bc12b6df69c98a4af5b085c76966b116d6a2cffe4a00733efe59a473985d5602319fab0f04dc3a55be53e9c87726d6ace09dd8343e3e111858a3ae45b35de08b1730fc628265f0afcd3924b9c143450128aaf68f41fd5bd4aedfaa9411bd33032a81405dc45005c62b682112ce0952e1926a47571a8790d639580797e33f991aa9c0b7178448591f044dc794e31acd413e6ec84b3ec0ac0df66e08e9a89727f91620f3f18f9238ada2abf4557d72553f01bebdf62bdf5742d25b47def93114918c643aa2bf8761441ba5e6699760f9370b5c29545606f6003e4c6e4725dbe4078b416022b20c1d2aa30d0dcbb724783777fcae6d2487bb793e9435218f93573064f47408d08a9c39bc44caa91c24177e8283e59cb9be2c46c5329b150478beed8c6e1e35bf56c3becbcadaef963bbc70128a1518c635420921fb37e2252910e270692e8bd641832740d67f2174ff3171ac73c23512bb0682a305899af28fce475f399ffcb310dd96cd469fbbb7629fbceccfc497fc2e469a14943fbd5c4d24c8c89b66f6638daa38cbf9dcb49dcf016d768acdf758356834503afa00b7f5c8116e147c5397c2aa8ec8a241bb2a5dcfd45627821a79dee1ad9b162796b53c59e3938c94a2a531b737b7d108b9f1f42a2164027e7d3922858aa7931dc0f7e0ec8e0fc30c27d4722a4d083115c916da5976680da42e3a7fdbcb8084abde4d1f95f62a2291847c4358cfe83b13b9ec2f1378f75f787b2b573a027b24e9eb8a47188be809666df8772e43672f910eeb1c23355987358a1bf34c3a88c2647a46eb85c1429e2e5123acfce3504e0ccf4b89e9b3de548e2bc16b8e765bb53568070a17b23aee93b0988b67e10dca6129f19083a22e950a6beaffbf958a232d2b40a7966f96d8d6c1d30d4e9d42ee28dbcf0bfde533a8b5c07c32c90c634bbb90471c53658d596fd066db06cf96e76f5563b2dbf17c284fb88a7e389b9340cb17c0707caee7791234d4b9cdc0406a59ad5aa3ebe06c7ac21851139171b188bbe7b43422e3847e30014dc2f4966126c2d23e1d54d0db34fb2f415347f14ccdb4f533d2f4ccfeae45f21b027cda966933daa5732464d7e125f32b05447fe1d15170654b53a5fc3ee1d2d8427096d1f71f2bfa3e240740c879ab752f0b14d1d17fd880f05d65ff64a05bc08f69d97fb63dd78346b9ca038d79764cabd013d57fb3506d4b0ccef1c92bbd704aaba9cb912e6034ec9ab77210531c9a1266c272ce3261dde19b9a574fe5a7a031416011100ef594396adaed9f884d18173f0fbf256e47d5c57a47864a3d592c2324c39bb6b9f8cd770e23e5884fbfc119eace855f4f21356a57f912c9e27fcd292534cf2ce0e0490aca08b4df6a3faa614239252279fd2c3df91e054129e1ba23fd9b7a90ed0cbc1f9f8790ebb11bec7b0b07a228054e1f8bb4241ab3a66bb6a224bafa455ebf835e5cc1b0f7701e2e64190091a577dd835afc77e72f3970721e1b6fd64ed65abe1b7376eb58e3273254b2da264df7a97286ac43f1c55f1b50710f54cf02da4023260084aa143dff539c5c7d5951767d0ca6b48d5ae8dcfd1727774ad1c5e7273c2aa5076c0a0fa3ff8f1bdd088fbfc17040808f3bbaa83a228b573694aa171d4fcdf13185e0a010788698eba537240a9ee729d7af975b4a8637901fa3aa401cee44a0940b4378ec67b101784d07fea844a50c542fe2a3e01bda791c2ba0ea9879bb298b7883e1b8ee13a88f9dd3b28813baed3f97c29bc8b9b2a0bdfd03df29f826498abe20f8bb7ef6be2930377c56430b7b0ffafa4193998c32fb12ab1ff63695a3201e227698fa8fcdb065c9c3a82d2f0b8a78ddc9afd5a1c5b135b019c22a46d8401559149293420d91aa98397741e9cf6bd30134bd8b5f3c5a1889e5cdb61aeb0f8a052417c5dcc3eda52fd90b2a8c2ade1a0cba31ccc88a78e1573f68ec6104fab6c417c631e90bb9ee10daba4cc047ce30b2eb735ec694521b7a87edf3e15fbacc941269090845894eacc56321d38ebd3bf3bdcffe80e3b21e4683736c81a61ced165e3a2fa10b969ddfa1f55d340612e7550144aa43868d2ce06491f2e5e089b1fb3880c17b6040343b795832e1638791ab2d12b1df0ae253aa1b3e9fe01bb06f7f306c7468bdb397cf4a9977caeb0a3c95adcceb5161f95c985b08d5d703bdd011d2d4a38f16795b54058fa2183ce076cff0762b3ebf56d8d8d0fafdd508449a2f5b0a8692eabfa509dcd0b38f09f4f99e56a0044c61c067a107857dac52e1a364ea053dcb290a7cc1c78420bf502fcd56c804c8729871aae4a4752eda8c1f78de3419afae90eccdc7572a00deb5e1a90d1b8676ac638f011b18cf42c99264d350b77a64a09c433a470f3a2ea988348f59abaa12a1384b0558890e955f1f385c05c740a0b44bb51e9cddd91bdc46c8804eca94cbf9e0fb0c18b770b70f81fe5c9c6554b3a781b22665de565d08fe0b3bf6a57943888d387c19c296827e60eb6b81685016bd1b1c8d95b29eb8c335fd76b208dbd5054b22e1fc0ab4743f7b95d623ca64c9f9afd5285978bc5635a54a70aa16e736372ed027e9518a4d0d0f9951996b210830e6d46ce43272dd0923483f986349321b2184555b6a6573bced5fc778d682085d1970f05cdbe85c936a4634c9821776b4ca2e8dbadf3715228a73c71aaa271ad02bdd76a00aca5bbd2036ef7bf949814e76561a22c2f2ebcc43c7f4af62f5a40e2df2ba612e77adaf6715e1c980aec44b1164ea20020dcb5d9fb7072052e733a0a5b69d175ba8cf48b780b371575e490571e05b3fbff92f1e0fb87abfb18f4f81c8838d5bb155942adcf8911fc3926a22d60bc9037d8eb026ea975c00937d79432be5e791ff1265b396443813020ad11f0e0ee66bcc4d68aca9ebc2b4b8aff28de824007d9d9d00a12ee894e55c565f957f5f0cff21e1219c0badbc99de37c17efaabbbdfa903ca892d5a99a7201813a2ca9cbf7b5d19d779c82af7a1be51cce30ff3820448d2e10b39154573358bb6376ce5413267f6de7d7cfcb8d4d9aeed7a0f6648834b1452c58f397ea28dba8cadd4ef29382d757b78649c6436aa3e38505e1543fad8d22a415f8c0b6afa7bf16cbe0aa85eb9042f0757c8f3ce4e0d432b2b0a328ab69529c5f8bf8da11b0b354858df07e4644aeda913eaec05fdc24b95f6f4307741897662f347ff5785bcb06c0aca0ea708cfee767f385962de34b05f897242256c1eaf5fd9382fa9f07c3b2acc2d0193cc7688fa71448b4374cc3805cec6e7b503a693be2438fb03037d7a70088dc9fe10ac37c84d29c8b5f04648bc23c998872af1df21a88cee43d52ab580248f6d11c0896d25c4ec8068afc138518f52a23c9c8ae8dfba103cc49368a2ba7a6111a8d0e154d007cecd32d9a71c3341ee238d7664d39a263ce2d5efefe4065c1654c4996e5eb10397d78ab6ad8155ab5c815707655d2a85a00187f8ed16ca19f0fbc8c116417420666e9edabb192cb81fc6e2a4fdf00bcbe0ab582a63de69af3d7e7c6ec7f23c09f02a81a221ca2d2edaa751bfd3949ecc3e81d6f518453b47911b0aa13ff53dd8a4af4b6d8f40cf4ed2f5c3e700749aa3211aab791b9e9e899b4e53f3cf1d1c62bbdc06ae2ac394be1a9694858919da321123184a8a07d01e084655b974e8ae6919709ffcc4826f62b6a5dd420b784eb881ae6e682b292d2e575a28eec33e21afe2fe17e024829ed46bb4babce2e65d97a656feae5f5bcd3f10312a5a102bac3e502a468c382349d47b6e7fc4435a8c56d61ca2c33d93ded9f2165c1f640cd23b0f36e64adfd4c5afcba0fe8cab87ba2040efc0c2f00d3fbab933303b1c34f15a60158e5ebf5c82ed18c84c54babe8e1e4910921d3cf829cad909acef813f174ea65802614fb567944b14630d1e4b063c49637e7110a2ca6de4f34935866b3ff0c3643014aba7f8ce5b2701abc1e0f9caa048e7d8fb937bff1c0319a1de8f126a16740d7f0a8833b60b56864f98ea428e2f105ceff6dd30a16bd24da9f75dea0f4ce864bd44bc52b73057527b73f35a7f9e7bfdde6435e68fdd781e82b69b22c09b139b35b5a47a385ecf05cbf2152cb5c686616f81585bafa01d067a5a086cee61113870dfa9bda1b2eb1975403b994e4669b30bd5354784b1c5126ea7313e3230fbab806e8cc7411149ac52029430ce0be92453dd7cb39026ef26451d2f230392670bdc181a0d0b24267d08861c5e5e0d00d85b84a0873c02f678f2522eb8bdb04c2624256e79396404f475be988e4ccdca00ff9c4aa86cc48ac5f05d2ff1ae536c5f576d719862d44049edeb7d25c2e78e328bff60bc1f09db639c10486d65a8da9638080ab92b3c9af7799a8149cc771857f3d36a495fd7e58236beccd8ecb68aa4fdd1f8b3fc21796e7327e0eb730e0cf78567e40a8c0842dc3a9f7451f347af2375ef47b560bf6f9cdc8e682ae9574b9d7c9cb4c764ee84a22303a35b49568d8dc89f74c0447b0f263ec71e4acc6de6e6116085b7edbb61ca4b198e2af4dba714c3fe6b9c821ca1880eb1b896b01d086e80a43ddc9619789c75ca44f8dc9d4013ed4d10c50976201e6f020d6993d42fc902b299000581b04d1db1a4c548a774fff638bccb298f45bd0a30ac11a107e6b9042c41634732855c7431610456d2d163129166cf90feb8df5a72ad9ca31a8613ca3df539f599996904716878028bd884b1a8d75fd0d3fcc6dd8e007f6f9761ba55a00fa6799b6a3ea67a6a55ff8843cfda811582ef1b553b27c05331aae09b5a46aab96566568153afaebb7b4ae5e71f7cfa6fe08aaa52aea18d1551068e25942f623c4b8e8a56f46e352cafe4885dcb1eb19c458580d2049ffd77af8380ff452acf5ab88fd52d7ef112c29ff6464e62465398fafd06ef81bd3fc2b4feecc6f45f0146c96d4a7c0f90e861a1d433c5deac14a019f50511d6ae9f363952c0ba815bbb3774c97c16038e82e39b76bd15f58f6c693a973d1cfcfdfd65ff61efd3d6ded93c3aef8a715097e97d24ddc94ba972fdd68c732e1a9001f3fcc1a71f1f9fcc1b98637899fdb949c281d858130712d5d5408f0208d62f5cd7f81dda2649edca15790c87cd4e24ba48a7ae328822f5a21e57f6fc5a6fcc71d532ca6817f6eea89f76b60e4fc7bd243c2d2163b46ec46ae4be40764f95d1a51efe6f6d8274b668c50cf1de75ca2b4791dbca7c9232d147d568cfeba0b44caf8154bd09fe8a55a8bf1bb1afa95226a827167b13f33b924ca637182b0bac8b56e03327986568016841bd25cfc769000a7c746b2d930d291ea94f371563b92535003c4bec0bea1b134915286a1665b643bd011015ef04ac9d5abd487c0c4d3c6b20a00646b476e518fc0b008960148a123365cb40be362b3b1694a8d5c05d23b018370f616496a52c2cd25021c3795baf897f812f62a5a5721ac8170e79b49cdf906bf71c83af3c445a82a9b0979506e7df0fff03405f717f51c69c995d11456b03cd8bf9395d33fbb127e4cf9d8fc8411a26d42617ff2d64e886ba9fe5c7d5b85b43fc4faf88e7b4eba7145234769d58d53a5c07d1468693b0f93bac6e2cf5a931b11506f556484824d227e448c0a3805f2217f136c1a7d56f3421588e286adec32d32422b95ce8fd81eda1c3e9beed20f03cbe487fdf2d65f59add2bce47cb5f225b2c6c09100225b4276d3cb5b6792be4b8f0489bb750f1188f371880930d79cca6b09b2e3f303f766081097bfbc5e538d3cd4ebf27befc9132225dd7428d444c764860a262e95221f0f1fe57f5ef3e4432d2be9b3c9954a88e58cb329ce9cd37f4fc8494ad1cef800a7bba8d2ce486f7ebd7a5bc9dc73458bda9e4c46c6297469cb8d4e3877ea8db014c04ebd313c6b1ab74abb69b03334d562422a6529b8e68f4262dd3ff05acf1c6d0074d35e4e977c665a26f86d6bae2c4d64114ecfb334c4d575adab7905729ecc6345e3726d7f2c361ab9d75de26315cfeeafcba9bff88c0ce812554b1c6ab0c5765c5618f1bd8dcde547b86af905406ea216e4eb454e59a835fd9648dc5c8c9da88d7a753a2516b50d93e7226868bd0c4c6c2eafa7a0696a8ac2f0f3e6958efc1e6504032b42962ba6eb3c5bf856cbc6bb090d481489c42a8e6d5721b6cc02b34d6650157752126de0cac4c31b7b073e2d6d546476682be55d764f5bb3154d70dfa9244a6fe5580db958e4a766f95a61987102d67707838b177d10d116ad56368c48e815b30fef5fd6554acfc0d9e64d3c4f6b8e9b8ef6af2e09c6126a92f0865045cf97c94070d2fa013be48df5e50bbadd9062fb6183b147f7dede8b571826f81d546abddf5de4f95a97bb75200ef5dec4abef4950b587763db4fcd61017a457c00230cb8aec3bd775980ba70362b6e8d064f81062eabc6149c115feca46efab3b703e76a9241c72f6b6810adda98e1baf07d6a7d8189f6ec869b54941c40080a91980fb827c61c1f7399539387fbec2d1d46a54b1f518859b3a385ca098b86039bba25d2e49b7968281e3e1c3e5c48f2012680d81ccedf131a8c8891b4134bdcfc70854fc7787d03671c9e55185793ff6926ae12f1dfe8cf246fcd33d88d159842e8dfc7c257836c98752b7152039eecefadd80ff76e816146635ed2d36fbcce101eee7daf1515676b9a2b203e1cfc8859d128852e25f9cf924c16d4a47272e495645a6dfde91cfeb39f4e6a1613a901e2bab7c975c885f6424b617475aceb396d0d3da14c102a69987f66f38599c60210dcebeddd8bbc80aefadb225df56b7f48d1ab0a8c92584a41b9fa726a7de8620cd32472c1b89ee1cd0e3da8b595f98672343417f766bd8d9c52f3cc1a9bd6e1c8c1e588c023ac6e5355e68aec6bcc303577faa7bff293265f9506c6107432145deedef7b254d5890c755a39f5b3aee4364373a931e98d5ec011d247fa9ef17a68b2df72810929a628f6ae634f4427c1538dd02e1c9962f33273cb6add06c81d6258de794f09700a9c8b2b6c3a30eeb00ece206d70dca75beff10e9619d80bf0a7d93f24cc82b33640aa992945eac34fff30584801e2ca0fde10854ec1c60cc5c4bf08753009063e7efe7e07a94cce2de1d2add68f2abf5e6fedeb161beb5cbac9ad02c043d3d157acf018751e1140776a7f32d71f34c05cbcdc9c08a7c7a03f596dd7164540566fc54fc1fdc2b23b14f002eff9066b55e30040ff5ac54b8fb6d9d643f939aca40e5005f1d5972feafcaa34f2a72d6ee03ed74fa5e70faa11ad4e8ad2d0f788900aba49c29090a73b3432d9ab5d933c115abe4718cc9e2a2d770e9cdc735ad5991455ee0496b0ef2465e39267af0e36c30da7f3ace53cf3f6010679001e39f6e2a55da65870e9793b447b418ea1e519dca3c2bf0e1d0b0b07ad96a0708f428173694f70a113c0a0f79b3251914d7f8af58d59d6e198bdd6155cc3a4468be06e0af9a1c94c488c9fc6b44e759e43695c0873c1415fbf56c065a3ed585a790bf38784ff3cd7baf3f4b22533d735684bbde582438d213bae7dffaf897289cd0052d6788718be4e3b7c071d3c6c7b75f6e0ff3437e48217e179e35db0f088e80c8aea5749c71fec4985d00647877c9db4a55b51f07198c232adae969c821be6ee6c2b1ebdadb00a8916b1f93b1724775ba9efb421df723d54cf22caeeaa1b6cc7567a4279647a6e099cfe285cb30cea5a1019f43cca22765a15759f20dd681057a0832833c15c54cb1e3f0196aff51abc2b0ccdf37edab8b536c2a4bb072293224e9d4e83ed427b8ab2b92f52a3fa6bc28269618922a022f67f778779bbd3d164aed6747c9639f1628a6643f47dee03112facf7431bfa1954ab2d58c7b02ee380b86bec76fb52093fa5419c17f20b123ef0b0b5c0efded93f18e2c0aef25c1665c3f91a3f7faf4dae9cbd84efd9ec0a5ac4521051118c1e28dc3282be83918c9b23e06363782ad6d6e99f69a016153f70845309cb9d8e85d0ef65aabb02b0648665ae39d5ca7ae9c4de2cb940ad8e9b5e0e59ebf2298c6e16fe35886fbbeecc719f000d9c9764f3f90f66c8f9a243bb25bf84ff7cafb76be8418da346319798866bda42213d5acf00d836b2a0487b7fef2fed4cddf10633bc7f2fc2c0e7e7c8785b9bc1eee0d2d5ba42fafd5360f9c84c1a9fcf8a76ad2916c31d66257c39a760621cd0ae7b4189e051036acd5aaded0acf934fef24fe71a14cadf03afd4b7c1752e0c2890930d3f74b2674bd6135555911face869062ba346fb8bfc45d09f224e69273d4d00d5451ba213c798811eac1b8fdbe4631313aa8e35ab728a1bb9db3c806c46db222980828ecc596b8a081368d73f184401ade2b7f6debae497ef70b13d2aba139f22f233b4299ebec79ec32f868786c60171f0633ba142938699a702eb57a26d9d6b2e955a90f1020e798b3903e9d9dd8f8c98888081174469697170c38d5737a58c8258c8a9361d270357e51b67011ebd39578f6963f18bd050d014b592dc375e006cd02405623bb724b1dade6b3cc632db58ea103ca4a3d939dee5df3307dcbbb3e3d0079fe70c6acfa53430f31075b1ce444454ab8208bc4dd2b71d3d8dec8bc4d49797d2bb3f6b35338e9f1100b6c079f327a639e33cc262fad9b18fb3746829af4c08ad4a84baf08f6cd31070997c6d4b78fce290807a05914db726d20735e0e7058f73856aba4dc8642c0fd52314e856f32e5d0dc7edb7fcf7c5d04e2fea3af94ebff28fa8e886d756049f0e8a4c2d22c94866366ab8b0350e1bab7094ed1337ce3002463e49fc894ccbfd05f133ab0500da55ee616f23b36a748c528ee8e2b792eaf869e606de86d3eb0a7822b7bcef21c010695c05adf371a88b0b36981910ce1317560bf020004077dba0bb55f26249beaa36e7da60d783cf89345b38e3c1b5928b9dcb5a677ec98cd4acdcf960d3ffd40e86c6fa43ffc198c2bb1ba99fc5fed92714591730fbc7a64ab5ef06e18b5f18bd37fa9c3d954239d6dcbba27c3081eb7944d53428bdfa189a83db26d864dfb4bd729a2ea41ec866b8814d8a0664f0dbfaad60dd54ec7c61358ebc416a6bf798fc65c408e48c785e9a0746548fa593858cdd067ae1e0b5a35e49a338dffb1aaba512f5fda377b8f3f4aa6c76f2d33a6d4fa73169a9a2cddbe44b49075efccb37acd99774e63769ae150647f354f0b4b93ff3028c66de35f1d715146cf5d5c1a854b45bb38a5fa45aa211f988b4c9daf94f61ceafbd989d168439c63b388672d2b0bf170b037e5c38e89df56f80d7c6645d7c045f4118fc79b7c667e0072500d627eac7bd3a17614934e238c2f575f4a978fd53246da9d3df02a28b9291cc09a71361b010d1605e86f4f58298cec9be2f7e17aedcecd5d87d7302b2290f1313eff056b100ff9890dd989f495182e2532c691d96aa97dbb2ce6481a0f76b4e26fcd97a02996c39347f90aadad5c4a65e62f9ba6f37fea8df342d5c6cdda448bbe7dfc4a461fa8cbe1c2dc0a78abcaa67129b998e6f9a913a6e7c84e36b936f4db32f000d06bcfe8ae2d5fac04cf45bf3fd3f117bb0b3da685e109a82f200a1e0d7f8522332e5524a3fbc6e864a86f9fbe30558b3263847d890afc1b64e835e1526ebf69d743a13717163fad0f9e058816a176051dac15dd0b7e2f0ece4d367abdb72a339898575595bad4acc3b46b597db68a5b6141f850d243fbe0b3cc113bf7eb27fe4359ddfc4ff3ef16bc7acaa0f3524f310679c03333d3fcaaf2e7507ba98f8dd1b770f36e426250b1ff8a9d4bc25c463ba8a7630a582aea3252e0ec28d656063d6177f74b1c88d457bf9059895e570cecdd6fa724d2015eca9c76ddae2798f82a181582723d0bd2fe875792e22bbd67b111812ef40703d6186261d6be2747c72746960fab45840f4ff6907949f20902b065fdee98d2c13ba04152bbc70eb415b14e172b028771339fb0ca708bf580bd2fb6a6d6efc0990ba5d213fa95f2efdd8b1c1b699841b8e154451c5de23871b54be129af8e3043ec5780cc395f325d33c4d932a30171ad6c362281b895db4b604d1d097b8f4162bca2f6da265e7a2d1130043a9d21c95effcca1ef06d47c6bbb7860392e5b77d17706b5accad18e8bd19ee8ab2e950a5d8f6789119a4dcb02ce64ad5fd29879e948be85c8c35669a06b2fef4fc27ad44a3a5cffff063f9268ba3b8c54a777bb750eac7e3f3ee767a4eeacb1b7019d3eac82fe5f943bd042063df081da663ad14e7f4661e550e495f413002a6d3eab63e159baaeb60fb7766baabab0d22b82221bc37ed6ca672ad60102c15d040e6085a1f4fe67bcf63da0a15205892a04dad9b3ea918adf24d6479fd16e935badebd0aeae1cb6d505ffc29abfff2708db39d1ff6420288b3b779d291e3ac4b944512eca4f63f4e1069281a089d91d3363d15975ffdd1b103e4e2c163bbeb915a5d08454857a9d29d24b72a7e7df6e3a7e90ed517abc95a448aa0179959285247f17cc8d0532fb13738a6a21738ebec71e2e68c55d8a8b77d456b385408650e627970ef13765744f4a72e4990912186a403f71bf2a9b8ac7211a0499266466c65de65157d36302cde084d348ba46da3efc430677bb5b34f75f39f16bc710dbe9c4a4869cc6e820ffc59239b1049720bc24f5e59395f0f0f153bdbf207df37311e0d85db2906f70645c876c000583812026239a535cc06a4a6c2201b19560bf574825662aaea2dfcfb3551752e89459e4082e9196dfbe1251fdb94b9f997689be8e8609d4d78fade40844bbad5caff8a07376bd83a13141c14d0ce0eb0a9b2e621cd7e031660970aa4be5f7dcb5d15c2bd2ede463c6fb2bb6bc1abcfcd7a1af96f1ae98ae81d315af3713d000ab889760c12443ac5fa79a48fafb39bef31b3c3b9c636927e868259e64ee02f2f9a5ba0b9f1c4b2a9e7cb48beb319433419798210d720f6879e4cefe84130bcaf22c1e270f3e7262a578ced12348bfacc7ee33573d2916ea63ae14659f467dd8e5f72115537fecc1406e977438fa47375d11d5327cf409aa1ec22b0d4905084e18135917ce073aa8bdbf4d9057bb2e7ae21cd46342745b6c1a43631a5a25baf33e59e461339e402f29d787463c8d5ac2a889e7d740b7baaa588024c683aef08e721ae1f880966e35e8288b4724d97f6feaa0d812a9e876d10c7c8c222742ed14764b183b66100f3644c98ee165abe1f36a2395279ac1cba57258cc5a26aa5520a16d77f075214e439b6eecf9791cf735066b66cf71442b377775018c9ab44312fb5a40c4833d198a2cfede24b5f8bf7e4231c62c5f33669a2ae631b3a116af83acc02b72e05819f01a5e1f0492b5b11ee1f3a73d8bd473bef885cf88b2e8e35189bbc8ae8c261521a0000cd0bebee7295e8d35df1cd49f078e68993fd10373a53eba652a3f4be4016b27961e93935a059a321c20970e694c4678813216632a684de2ba44885592672cf46e54c9ff27d01b29676ec1c058628ac1e7cb063885c6f6e428195a37698c7f1941c3066480ef3d4c8e1b601b6b65c61b21c10bb3d84d09f7e1eeb38b7c94d1fc658c57106b39cfcad009e4e4b93c6d969b0b7ee231234cc1383e71623de0c1930db8a8dbf266df0e2d924da51d9f49e836b82d2ce0bb30f50bffad57cb960f448965a23a6057140f7da0b5e29caa6f95025027be799a52fcc906cfd6f55cc96e712e11ba2bdfefd3ef150f1f04f6d8de5d7f5f9f9262ffd4c0509078cfeffc27d9bacdcbd99cfea305c080c296d6699654e909a3f8b05ec63ed6bf1c01f9b1b1ebcd5c3d34f8d5e8a5d3386626297e31f510a7dbf67751afc4f77effede7186e0ac5a05c4cc7bbaa0ca610433f49bc9518f1ab48049c1dc8e7ab9ac646e024225326431294d5335d627c3a6e9e8a06d8fbda1720dfd868c071682118c570782845edb082de727983c8e4be4aa9196046dd5a92f7e3e9a3d993613c76af2ed052681ad82d8446aecfbd169b3a659d27f0b012c45b9fd2d5b022492fb34176720daa6af6b61d245cdd44a017fcb0d82b4bc34d8c14d8c815b75616a4b8a0825658e903767625b4514c8ecb6bca7e3cf28d065a4b18456ee149ee611f6a6ed9fc8060a06b0f0a6e3de41e7d4628e915808b939e901cd0e48c11deb612f94b1eb4d589df95e2b19077aaff56d57afa46add91f6274ca2117fdf4ec9ad15f2ce0eddcadaddeb39117da645bc127188f7596ca6c7ec46914c17968e3c2c976a4d71f7f8e853a558d6f09cd504e0475641389dc5811d424893cbc25778b3f9ffe28d83db243f69d7fde1fc646d6726b7ed9ba058a2a69b0a368da3d7da417d71552e231c3334b7b37884f84d831e2952e80b10b205eb9b5c02697e110e3cbaecf4e5af641335a6f8c4d00e8d2862717d2164e4ef64ca969d66b23cdf3bf06f801fef9553859094bbc872153589e8153a49c233294fdffd46656c1304642139fecd39fbb08abd4b8730169b9615d4809910dbf0a2ccb1fa8d0c38c950265c77fc4904f97c11c5e59b9f92bc653e67bbb8ec57e1cb7111dbba62ee56eaf48210af4f5f238490a4aec16c6c60fb4d968915a5a6fb7e6767111a6dca6e279498aa016965c58939dc65f55863d7c21b6885c6c360b46772571acdd7b3eebfbeea2a681e8e10e4ea4d95e259a48bb53059650c9914c768f1b9cdc3998558b5c3fb2bb4a643c85cf4ac4582d554fa71a40235700747589a8f837ee85a9c66d18bb3d010bd28f47505c45bf7d61822152e6acd38b3103115e3f4f4839d9ed1fdc3a9abbdb8885274ebeef30278964b4833509fe21a75875b7a1e59aa1f293c9ebb12e2f8f2f112f99fa17c5eb3e7f4991416e2829f7fe1f851fc3fabfbb6c03ca56f72f11e5a21da6d3a6d9696e7de32137173b91c2f6891fe71089510ce634749312f9ac7124ad7b6757e4ff3d7594057e65742c447d56a91e718ce52eba5bd2d70c9fc35c463a9dc1c8591d8dd2092a7f6686bd784de00568fc57ace7ad9ae6805c37e8b751349b9b3ef1bc5cb2cd17d7a11f3ff522151311ed21e0b9c9c5ad9f1e4787e9cca1732f1666fc70b51e9764e66d1b9d30a1d88d75524d3fb53e5fb3a618b50200ed743ee6b165b147726120793dad8ab8b10e937e32de51ec7e3f2a3dbe047895ea4a6ae75739ec0e004cd0ee5fddea612d85a1ab88d7d2736c6e5272a40a3e47d013763d5a9b196a4c494ebb2ad4c6f72dee216b533bff8a61fb1a5dc95f39b4206ea2530a7844e77df2500fdbe7ef344d09898b7f3c5d8c79e3f9e9e99981c3df0e3dd7505696fde18c154f7e02d9bcfd47521d7381c93ba2cf41d78f561a3f53eccd577758e03fdf162e38e6b7ad8394b396bfd6aafce275591df4e8032d64784b7a731c408694c16a338d771eae93499d4051f8c668712f2c64fdd596bbb9a10a35766928428914a38b8a557856e13f97eda358b4489ff9ca5d523841f17f746948d5aee5698785e51492d8b8f6b6ec652b0c876ceffa2ed67efa633f66e21a5f435caa7a7dcea449d8e8a9bfbbbf8357cf2380a303ef8660522910a645ea39fe978baa4a3fcc588d283046b5267851f872aba05703ad893f89188b0714dbc4866be93dfb1d0d04e374ed83abfa660da4c6c609a3274e432b71475270e532f06da1210163895ef1d4a256adc7f300262158de51086124508d017712fc2eb1e2fd2d92222ad09b2f53009ab06d9bf5f3e71e7383297e63ca640e44389dbb99cf0f4845f71bcbd058bee28d4db1d80a328aba88bdd9a80b726bc51e53a92960a985e7b86ea2a8e88e6e3641180eee8cba7303d54eb60aa3860a0505a143ded66dc49565e0a80c0b31fb85f4966a2154c9d64eabf2dc8ef2a2014cee92a3ba64c27b3bffa528c9bf353195dca0e95329d8dc1d50b8d5f6cba99dfacd70180ba326bafc24a472a65a5929d7928b11443974187af4baf36da0e89ce5f08c5bd698fbfe81810bfd7762c0f5d975fe9c778e4f1166a5e3d8fe0de5a195e128bee49302ad6e1788ad555b9ad8ca4892d11df7867bb6edadc878894a0e199fb4bc05a34e04be99f27af0916cd68dd2fed1b2e9582cc30b8048e2f848d49d2955fd5ba97f0daef913749324112ce2864ba84998510a5281c1df35afedd4f98e3eb6c7b0c0a98b3477bc07e074614cc4d85fae7a151dab1a2ed42c43a38659b2fe859ddba5da7d4f2a8f63442bca4dd3e11b4b981071d764b8e02feed5b956eda0b872885ac801b678a54ee120e31429866ac759f6f373a0f1b95a3f1b42c1087371758e01278a69eff2eb0a2f1221629d020c7754b0ab0de3a0d6a0d2cb1e90f23fe08faff863bac1c837bf6696b734d066596022331c3d1cb3c3bb9be964e396a1e856553b6d968b73066aed50439d8e9a64a332d02a891c1d6e29a81e0bba8ef5a9f86683d83d72391b67b62d1780c77b6457a265da0b3599e0b7918e49208cb5cda359676c8d96191547ffa8cc717cc7b6a6f449349e1cc4beccfe7613f0d3b715e4882a69ef9173ac2c261cb62291602d61bf53ad9652186dbde45ffb908d1316e4ed3c1d0b21e95ea66745ca0f5d480f690d2c519b595ce82e967644cf7b72c9cdf158da5a7e8443a6c7b60c129f2063cfa9b9f8989065880eec8dacf623e93db8e99c09cd5d94df9ef277ea6471ac2911a3c86a92831fbcd52e3b3af31ff8445f043bc48bedb11069ca2b250ea31fdd4228cf2f7735b6012dd9027594afd09f0b5a38c1675fa7f6035d3b5669fc3375cdf438e635b62e7b4ddd003c8e366671bc8e9ef38d448a48e52feb48510daab05d38fa18c7d8c0b3a5e8420f933737a145de6130c74925bdcb3e305a07202f91385af1dc4808d026d33e6dc360391b8358dde02b04e6935c783280eb340fdfd4d015d2e525dd18cda917730df9d19b7eb51ec0f53b3aecdf46ee9f68fbfe0c71896553fc8e85115080ce5ae3937d69820757d54b4ea04476815a5321ecfa8667b5ad5059a4b5c9e4e0968a38900c7faf1d52b895c8420f1ec7fb4839fef81dc2825e602ce89f3c06902b61fc0aeba09483dadc596819019c54d2d1c52ef98bd2f7e6c3053daa2cc69529515d9cec00aa1a6aad3c4f093857fa82cfd78bb540772400277753a1196bd4005a91a3650f65460b3a9a36d6c53551053b95e24d1ec4d078cdce647198ca0463cd7cc0501369399fca08aa9df985e11bcafeb40899d419a851af6398eb3c15ce33a3d90055706c1da634e3120aa28de3eebb9bcb14e7dc2e11834b12347dc58b2292aa14513bb993b78f8121cfbd1778e1ee331461a556887a63c6a67d3265080f3bbf156f186a26bb800c35ac68c0a472eab420aa380146dc9076bc00c65e75e4dba58475e8b2c77b74f292db225fde4f6d2a959f162855519f07b77677a56c7e0e91c7154c9d20e400eca9e868e8cdc17027ee04164bd29678d7b8e6319730f060ca1b246489803918f62f9b7d759add3f3f4dad0a6ef1de4f4077945db34a570cdec7f7958103e0f73ff1ee8c466ea692d1dfaedf7e7a7e94484e1ca6204d044f468f4527844f765cf4eab0a33a680d770ad3507002e35ac84f6687ca59e4fcc3bb51955b2d4d98068d5d44a46ed5ef40704d3fb7d10154f4aebeb5d6a305de2cb6b2711c5770bf878f39f35779620b1d695c2904da2f6a595852630497caae4cc9a822c4751b51cb69d635e6ec47d6972a29c59515e2eaee01a5589c03bc24916b76c32ed9b78950e910211e331b033c052413e24ae325af29db647dd02ca06cc5224a8ddd55f26ac43a83d96e0beae9d7b9ffa31d515340cce114c66a177f8d7c291bdd49c1490e880d8f82ce4ea6f7651404d81367362f2a3e9b0ce311eaa8fb8525cf8690a8f943ce49bef0aa03caa44fcb439b8b7a31a72fbb61208a04697ca3bbf8b5a0606341a0e784d6cb82b093b274ebb4cede80485b612e321be1166e3c84f2bb1789b343863ebaf12ca70a92ac55a78c7998764400fcc9812fc3e8737af721a4d5cc5264f3a291f25e2b52abe5e07a38ed0932614e87fc1bee6b2a8b66b83fbaacf3f1b49270f8c78c5468ed6a7e4d2571d60cb9808c8df22161e553f1fc3361b0d4227e26d087c80693ae4c4477afa54cc53c3b15e1b3f4e137f9366aa52ae0ba3e5f2d50c84d243d55326218faf8ffc2d6e5202bd20e4823f1b4574181a7470dfd658471b2655b40395dc6359ae87a53f19edb007b977cff3c4b0dd1b2b23d4f4b5103cba48612cc2a8d1dcd208f85c903caeba0e6d3a7348a6129c86843df4bd2b5a50699955e9c1d6c6200dc5bb2d90df887813da1b9acc7678755e24da71ba4f60720b57ac93e7f8ca9e4c9c0be6a608008e5f5ebcb631542c9c2f6c408279633b43dd688ccb4679ea0e0d60267f194210ac7d7ff258f76525bb51e2ef7d72bb10161a72083e7de7ec3ce96f53ba4f83eed496525ee2ec23ba0e06713cb094637f2863d945432ccd307ef45e62b25266282b5227cbe0c9b27e2eb55c7c15510ecd3145c01ba5dfa6b57ba234d1548cd65e851953e0fe25805acbe0be413d12526dbf031d07f8e1177d3377a2575fee0dbf74eb62d01187af05ab977b1014a5f52a5a6f20de227f3a537eff328edc4a170dde3649d6778aae839e1e24793b44b4251518f4f39a2d87add841b3eadfca7f57d968e27587bcdf516b425e59866f31c19c2ff71c575fe262536499d92873266e559d4bd873147a449dfc72d80770e045c2d02bc3cf98270d5b66031cc3a8020e688c629886cd664a2e9e01491262a51d5472440257dff2e991101178abdfa061850683747fba1575df27f75a96a4d8aa64da924bb79ebe2e1e23ecefb00e88157f648c9ae937a5cba7d26dba81f9fcef54a4d550b6977656fd6be5226f77799b1b731f7f6f9ead317bb6a370075e4b5314829a0bcb4f67f35435df3a8303081a1d427409b01ba7b9824af827759643cc07c9ab6c20fdf9b94a54a3183d21b6f475f7b7cd8a515c1cef21b386368a39d855a92eabbf9e691ff24556ecaa9e551a8c415d89a0305c15cd8fa9838fca767318f14de9197e878c573bcc853a83107909311d62804fe87c3bfb056cfd43df4c09ea3a0d21f933bf722bfc924d1430ba51efba89d0c5e9450eb71f9e016ef8833d0a06e59829e66398b1114d39479f03d506394ca034388889b5333f1d0bc9fd8f09b7ec5cb4589aab56d96b2a2d16aaeb74d81a011ad5e54bb686c1a8df3a1447c7dc256cb670644010f68c1433c187b32920b9311ed70434f597258ee69a55ee5434c4c80623288f8cc9889498a5fc6653f4b823d6c3e6efe83d1bf4950ec13f9ffed06013b0721962ea59b8ca86cc06f05cdbdd0d2305d93abac05726b527177683bc28b149ffe1fafa89c009dcc0caf55e1d9bfcd1c4fe397d3c5fc0c6da383f4c41daa66263a471ffa9d981e47f85ed33653fdadce24b56b94fb30e567fc6184e01a8905a7aeb5925859118a1060295d50487ba0c1e76ca8f99e22f99a39b809b6505842261b0d4deaf7d83d2fb26bd39d2038bd1353a36ac970cadfdb87056420c78d63ea2b2a7b8289306c163ad35031750bb6adfaedbe1a7d51f5158cc4b04321c13926f56809b0335b6d88b5f779906cd0fcd5b7c0f0bf6d57490865b51ac8c9710997aa076ad1c40cc145e65c02d25485362c3f949763200c123e7cf1bd09cf556070bc874f0ab53e6988f439980de48974db3aa17f6137067fc13aaa24297473b2302d7b44265f473fe4455ee2f9d773feb52ca364a20df1ed7c6c78be155870a586e2132871ea4fad2b4add1d2c7040b46554c5b8586744dfde9612a76439e16bcaab8daf5cc20d89f880251a9fe6208c314095da7ac5ce369c57a576361cb1f66fe1da7513f997fd3c6e77b6d166592a749034ea50feefdc2f7a1bd4e6ec60fecdad23fcfcb829fcc8eaff523797d9dccc24145816b74161f3f6c47ab2b8632b0dbfaf01938edb025a9c9dbbe795dc542c24bd7135c7c5bf361c1c3bbf4a50497c9ef18ebab83833e4452a3df9657850d114a9d102ab023ae9cdb3db837d1b321a9bd69d9a278b97d1e086a2401c1ff69f5b228bf2b6cc7fd1e4aa6433c0bbd64a74a42591dc0ddf278cc12313d7d1b81c316018206e1f349b4ee5e3ad47562795c9478d29946e442c4494b6b6ae6415258f179cf340a9f99f9d16fab1a9f05726e37897d034d3f9b469daf9fe93e4c3994196a07c5f9128f04a17a8261a6e527629565c2890eb803722ec91e30c06ff14f407809e92f184c45440b20cac6f6be27fa691d140e8e584b623ba07dcd1ce6103c844f125671c253961ac00310fe5f4ab96bb88e7d7d7e1ecf63b5af80088110724d6a5ae7a4f6970cb920b3c055d82daf8e0b1ac53aa6679f5ac85959ab6264dcd6528d5a3f1a7c7fb9fc0e2ae9ed1e10a3331a450d6887fc51b0861b5f461369ae74099b381185fe076e2ea69b9eb54a699c9268fce1b3a07daf6b5dfcc4c02975307c9e725c3047e0fd1bca91f3133a5a14ba5cb001ed0523a95984b1a5c1a57bae0f3f556cf9c0ce59c2c4f892d0502ed46471a6745a5228adc2edf9f892b906b5c0e4e033feea3215e2b140993432d4c96c91e566cdea64a5a43648440d6cdce43c803ac6c3532d860473abb463d0737e6634aa9b20c78e73c3bbabb6cef59c8dd38fef882ca0c68866737731ac94fed1f8ffac930777301a35eed5c538ba913a1c63532c5fb6188b5c16ed280267439dca48f966c2a43b4ffc61261a17aee54da1afa7b5d2a92245beadff99989eb90a7c1acd3c6a066446987f64cbd6363bf750761e4d7c6c67f15118f782c7b9dff23b61bc124650ca02f0c8390dbe4ed73f994e1e5b45644838c0c6064624dc7761d3254dca99938bf376bb979921dfc19864a0fa2dbee6eb33800c50e4867e4ad14604e053b9a6339d5aabc5fdfcd160626a11e805572666d182eba3d983ae48df106572c7dec35eff7078d9ccd7e507c1e9a6ca2407231a0783bf13d201c4ddae4f9b77b4fb855f743aee3de013ba45d8a6420a476e52d38afb23c75f2f1bffc4f2ce861daa4ec733a757be06c5c63d086081020ded0e38a7ca7ffd27ba5cb21bc403666f301572e1763b2e60a7c0847244f540786740d26f0d1021a2b81ef853b2f07109f7094d4ae75f4e84cf1bd63ab94cb6a42c38b9825572036ab6961fc49dbb24094b2de3f3365613a04e557359ead16d4ab1e73be6dd71f37e88123c8b94c25c8b2bdeb89c517e413d9d09c6cba7aa3e573a1f5621948761455c665b713877db28d7c062ad721bca8b7b28ecc060b8ed68b461e9db67d4808e9e2446ff7a9f2e59161e6a0fc484afacee5843ceb45e6fcae60af3ddb9749f003d9889039039fcebab673512ecd739ff5b610a9a90029213e112cab2d83a709e19c7ab3ec16bb60b0a53f654f55ad2b734df700a100e5f2ccb0cca15802cffdfcc8076c8f22dbf9a8d42bc6e00b4548acc9bfff67c5d812ba4b35991d6c58fcdd60cd3f708e06ba59abe93bd44831cd6e403fe2d71b54ac7d813cfb4eb047bf799bc95f460fce9549b7a9a489f4ad105795689cfcdc9225ebe59299f6989b58a3e0065a9f646d82aa27fd954f015889562bdd4f897fe642be846cf3afbe2acd4e2e40e842ef4a44956b251a8bad504676ebbe99851701584f2f4f69aade1ffc639cfe3243729c938c15f26f8c8571b5ae94b02cd95b26715034390a1f1648cd35b1f0614baefcd2d7cf27530d6cf8e26f553ecdbebecbc1f6b0f2d3f152c5add956bae4422470d5522af30f13dbeed7580f2d3c9404cdbacd60bba697e85aee7e54ff7b4a6217cd29730c1ab867cf530de44478ab8c3e57c51866136b0497b89749c72c2fb8ae2b9cd77ad8c6d1af8878b66f64acf9df52b15d9bff07669794a751cf198cb5b52228d9e810321dde0381b9e294a60651e199db8bc0784ada92d86dbaf246584dc6c482ae93fe74cfed9d2e708f49de7513a07cb38724c7ae1cc3a2648c1c394fa85c56043060ca058bf7dd4dbe8c515a8057d7c56eed326905f25f00d091a9f6a2e5c528b670ed8d20a1338100dd2df256b7038ca7b92675138ae0283cb9840c9363a320d4ecca6e37bce9776ea21add8af8d470a33dea35c40e2fe88952bb3791de1677e7b9c32acb116e2282c2c78875c685ec1621da3bf69c3ffd3cccd9f0f0b08fe8f1d126f9db0440280a00dce41ed7a43ec3e6429f119ba69c536d6e384fc39715c54bd37d0de9232dc2cb4be2c437cd2b225d1e663e10e49c3de42bf6bde842fa49329adf64d81b1574c368a443aca940dfbe491a33b63db32b3190fe67dfb7fb86994eff1c294fbcc11ceb35ce80a600f80b8c79e60a88a9a38856535203daea2878362368f2e1441f5252878b016cd943828f2eb46da23adec24265b6af97693e065848af0157b3a6a6c65a04b0bcc8755eb1acfbec2792364ad0ad226d5c5a3e7f9ab49de80a49acf8aa5c7616bb4a67c26bcbf466eef8be47fc155ef610c790591cecdb2173295bec56ebf4fd91ef9fd499fdcb68f36e11e6c618b84692cd0ec332c32fa652d952e73c3e3dd35c55a9c05f9b049821cefafaf3a59d7680aa9ce02472e2fe5055125c9b9ba2a7b25d5f6906cf88628b994085604f93a3f72c71d81758c471ffe2e3aeb47a8c17fa5d75276d4fb1123b94098ab68066b45f387ffec1d1c79ce8d905705fa504c8d6811cdb28ff827c1848292ab86f43787157dd05764ec1482f6adcd99c3d54b85c1896083cc31b5c8026d377cf8a4ca5a18cd75f84ae7461a81045c0290558c20fa6956c4f58755dda891ac458a6c915a2076467e537eebe355505fcc2c973695d7dea386a52d2155de2dcf4747ee1374bfae34f1e26bc7f26036a53735013c670e5a97765f637723a0404931b578979b94f25de1d78b8bd6dbc8190112f05654fcc37a2e3af0cb2218c27af91d96b4dac8c15c7891b08e339780fd9cbb3fc54ee9521ec8039151ae5b447e7d818535cdf3f51fa49a9099af7774862866a17bd8cc15acd395773cde28240aef35970651d141b1b4dd950f79db94e41dc623161575815f52f34b2c009c622a8dc0f5e3841a36edfa29f450341137d0a61620dc62db96d6a54702d96b3c71782051a54cf1dd63fb6ffac8adc98f0f85c2d472018d4129e2458df225c357e4c77af6284500ccc6512dbf2368e1057a2a1bb6e95cf5e2421fe6f0b616ece11b16ee36e39ac2d9919423c7d59e77810173c6d6395a93592b4626886ff32925dfc8d6d252ca7b642a8f96bec5b034591c8a8dd5e5bef050e3250fca3698de501b4147c104889e5653931be758151adae8edd7c7a859048951f53eb462b6eb17b571b9324b9e45172bb5b1c93c6923255fba2305ca28cde0c57ec6da95269c836cd41e3cc9f24116267ca0ccff81d644843f10689364df823e60110d295da8a109b616f77464182f1e933abee28bfbe3e893bd059ee8983a0c28621dc1d734c04ab7e3c39650ed778a7afb22e811aae45b0cbd8f2be085e01ae9ae29d98ea42b353f053e1b3e62f0260fb4aaf91c94bedacb06c9814b67792cfc18fbf0c74004714de8146a771fee831a8819432a549765e3d98e0381c4a7595d38a2415dee9b38714ba48f3c1346c2e5a92f5a8a80ec390e78e5faf01ef784e7f9a89746988302cafe62ebc6bea14110f831a65c195a164741beda5d652b95a05b22573d231f7376b3b80335d3fa56e8e72c2dbc695f5252b01966864fc7228549da767b82d7752558f7ccdee1fd86cf25b09c0bf84e6286df14c5cfaedc4529f20863117eeab700bd3cbfdfffa778aed414080fc42a8bdef1901c6d770399857789d317faa24cad19459b7870e7acaa3d6eeab55af56976c683bf101caa052643c878fc505476e8e9e47a9cbe4a9de664d58c79c5c9b66a524c631975db9d4bab2706e97e207a4acaad781d453d39f7a13297459ca8fd3c5486210568907e32505764e8ae1315c2c38b82b8a2196ddb0ba106aadfe33e9c80d6fc404353b4e44bc6695535f505b2e850f3db9741e6aab44cffa74ab724f1a064f4a6db4f5ad8eec214dfd50f7a48b42faed430a590e582fd8af38c59dc0732f03a39130abf80bd7cb216224990b0290f837c605dea7c9ed496a879ca50756c22a92036789068b7ee0b4680d98b0e5a2a3e3087a6eb25e717d18f393ec21ccb7f3e4216999d30ca8589fc7306f11d49e2a2b7c43302697d17b789c3bfb8b1cdbf4517033b234913ce80685bcda0ee097f8a669054bbd016d0f6c307acc0cd308d59cbdf7f87e4aada45e74bfef42954633481911d034ea97cac9323a4799fa82d4714ea6c8afe0da1efa2e9d869e1aee36a5d67b2d0511f77de5d325ff0b42e06c2bd8551cc0cf5cac7c958f9a625ce53dbf76217b52e473d57d1c906e24aa8c34d192ee6fb88cef39afd66b847e6ea395eaddc45d12a1586eb769fbd21b955ce3a499ec868130c8a6f22abda5a5c86c7acf53fec0d1373feecfea2a35039b1dd5f875e715a28224a278ce96ee79c13593e2cba3025232e08e9214042ea99f9380e35587e160a00b41b70f1b0eb4dd71b07336f46079c25be95471de8b42a9f4fb03a1ac104d4ec1ac2c3acd51058d10ca9d3b7b5657d7dec74845d0447fa39bda1fe7dfeaf26daa8fae39fbcdf733ef7ce643572c5d5feefb350df7bd18c9235a41ecae829193e2f47b26408a7b8e9e844158ecaf50b395722a6a476a1bc1212d9b3430c09e802f0d3ef353abbcf29e0fe0358237e2049d1f93e660f5ded31e438b8e7393b68cc6880d4901044081464687079bb02607a4977416ce5d1823d1d9ebcf7562219a2bf767cdc7eaf0a159fd12431106a23e403812c4d948908132242e1c97fabbd69a565b58e922d13a728e92b04c877e05e6e4d877a9d0a3d094305d89495cae047517463b8cc04fff0adee7f44858a6acba6c5b763447b03a42c1918dfb70f54123c18920b0597363af65b66eee6962d91221d23565ea50462518a8e60fc5ff7964e11cd80d04bbb2412e29933c293db3ec78a04f38802ace93251af084677107f9b580f4890a1c6bd45e3225364a042ca09a6a6a5aa53d46f1e3b407fad951694d4c3742c43e10125e8699f48a8d133b8074995abb90e6c1d757aa773558d4a4aea451dafe0aa9b4c926efb29afea8d85959927d431b3809b69c2e65b59e30443c66cc6f864c6eafbd7ef32c8eb7a1dc6a663f5e02acc2249a3a98c91ca21a25544af94e246616c099a4aa12923ffc2ee23a3694098595e2b8a06cd236b39c4977c6e3a1e0a98b4120a0c360bb9127e332cf3dde68d99cb086b9b0ee25dc287e2d3f5420330516cac8a4e04449cb6076c795274f1c54b0ff8d554f38526b09eca3771606195c5c51c7c995548e91171002ea86bd4bca9c893691fae0f689feaf12201d31d0f2a1a3a9ae7e3b70d787bdc0c3a2a76c9b5713ccac9026491bf43b5323140ab2a0547d84ab83a48369baf87565bd8733c6fb9cad027f435f9ef0cbe3c402e5182fc8879b7216394b33b855f48ca8b1f1ac798bcdaa6dab95be3da780be57dff876a641e71f5da35da0490d0639b9c178c95fcb0e1602ee3f645367b2c684b90cae2d4722a1d54afab89642e008970d172d229c1fa4963635b5735e3c2c4ae30cc47a0a906c85f7b38a9335a24e87c2f74aa5c94902d4ddd087a9d5f65cc3fd5cc543545854a47a4d0a53ca653be46c4c0a5bec89c253344b000bc86379a86f2fabde29f2b56e08d6eb3278689e3611b97b22bbfee3d3242b7451af288f34c3ad642ed7352f182baede02a5deafa1844f1084bc4b5bd9ebac1e5766f7038c65868c970dcce1525c4ba4557cfc8647ec40f9043c4b7027350472693fb7371c7c212a368f1191f1cf1872aa3de694ebe05ae0a4f5ede7131856c643d7bec87cb58c02bc22d4df105cdd1810d4b9c07fb41f4cb824c03ac290c3a9d5a76492491616355679ad42bc98b06723ec035049726cc3ffc72072ff46ec39a9e829374b6545d5a2b5ccf34fec3f1755ca0e6e5b228e0674d8df64e3b8de4ba669490198692837079a8828cb0c2090ded5cdc360f67f21057826e4834901f4d306114805513678e4823b290a28beb8204ef99ca8e0d6429c7aa3e2d6dc5ea23ff89d325352fe7c3aa6f47f67d26cca3c51c383b62d27b009235af15ba039e84cc5755e61052f18ff2b16d2e7fab90e94cf30c36b68c2368727cdd247ada97ce1b5ca19e47f42a04c49c1636a68d74e5cdfb53a237d65d3dd421b24ba59ee8f6d47bb3e7bdf2472eefd148a9cff0422d8fdce5a87c43ff8c5b33ec890e619a190f147800cab6d1835ba2bfe2d932e9e595a87246346c5468f1f7db9bf08cb1158e2dac85ccd8ffe8189e30bf0487cdbd5d1fc1ffe34130b8b1a2191c0858d64f1e216a45fdd3e5591f787914cddb4557c88e6f5781d486fbd0c2dd7b68a9f3a9e05d2d29e7aef4f851d421a26d826fb69d1063815db49414296c7a930467649f5b875cac06134f9bcbc2d6bb9c88084a6ba106a6542bd03a786995d03f8c515cf66004b64f5f7bde8986aa02bdd84af0c9f6f9954e86f046950eb139b09f270be9f4b5fdc355a972f0e136144f1fef3be3d48dcf2929464b8bc255c4e814f000db912e999e59d37c272bd5adfa4f68b237bc851c2510b358d194adbd97f6ee38458de219fd1faffa0ab3dc0591aac11f61a3a9342c085d23b6c844eb3ce8c0dcdac17553eb1316d89ede3c84622224d63120f1a23cab58f5462386ddb407afc118398e304124df2358778987f85588356bf2a89874b9b4f83e326e36c9dbbc7d761fcb81ab62a72f0aa03107a5410dfbdc35b8c25e048c25ddcd79ad53ff6cc1b00c294b420c15627fb66d76f93fba4e560163f51766fa15d207b63ade8db5d216b17160b167c098cbc26f19837e15a6bf3ba37f93d5ecce0c14e2c7c780debfa99eba75add973226988bfac7abc0d4f0418469ba08cc4305c60672c97bf71e832de7d48b7cea61ac81e67de5e4971440342624fda46bf6b8af196827b9f85b0ddad4746b67c4ba2d7d4cbf1e7db99ef0a787646414d6a779a05643a821e6c7d22cdedf473e70050f4953d66df272f74676904ec5129fd5469762d8864a3a15819ea7c5a1716b628862e2a4c318d7b96384b75c0de290c035d3444bcd196a3f5ad1464eaa0e0c8a3190cd3d00f9c5cee18c86fed91624784685acbcf82fc86a928449460dc5b791da0e973f110c6e7230bd5b3ec98caafb6d4ae0bbc515664ec0251e66d8f210049797d280563418218f07e430ce2096600e2cb2c797230b403f21ee8e88d2c3b03ca7b3f272b0daf2ce1c2eb069768d92199b31fec315da1caf22e5a422410282772cb91f9a52f7148628889077b3f81d145b8721db54046fcebdf6d9c358c1578f120696e661f51d1d99a44448873e45f02fd7682faf0b7735c9867aa8673b06a91448f34e3f73f997337b47e4aa66248682d88f24daf2bfc0deec8d8a6dedf6b707da048eb899dabb34c4fe53de0fde66e2785d21c790ab1d1584bdfd96906a3ec1c269148a6943da1c537baca09b8adc5b6ec812888e232c76c29c0db0c1c18bbc93a81920c6509aff95fb46704b342b8eafe9581c43d61a65d135da188d4d942bfd0effa1db8e068cb6618f8bff6c0fe227619aaaae571601e749fcedaa100be7386a3c8b68694eaedccb2b9d2e0a6356a0f8bf1b7a2fdb3cc696321fb76a0c35e3f3784164ea184229a60deb76fb919e6860813203a9cd502bb542a216ebe2a9b458daf52df6591c6c5f16ec34b4a35f5c0b5edc4868fe788465f70bc7340ce661d43c178fb6aee2569d4e1f4152d1acc5a32879a6c28191828a8410d28959acd2e51a37619f3ec1c72e425a37065f49a1cccafd1f2b517c2f058133b0a36ff95b6d16274a7776df502bc3909e67bce5d1bd8ecd3d86dec0344c14448ced0428b06e309ff6b61ed1e128fae6728c921f3be87180fbdef2faa17014be6a9085452d7ab3133f51e41ed39d14972bcda0449751868f847a71166f6336df799fca7118e8b474e077d2ee6b73be947c9d3e53d662c915cfcff1f09d67268b0f2767ee0dec62708beb43be805c0b4511b97979176df458fb1a925ffbb05e4b7c58a20946a2ae788f8c4c1559011bdbed1cdb72b7cd8b3bc07f4c281a43ec59b2e169ea9fb9fe106257e8db9207c739374535f7731ff817fd6a97da5aa710192f4d4a88abcfc03ba764bc7e5b372ba36252ebaa2cfcdb05aed4e0b27401e1befc84ecdaa343a4a8185f6f0290ffe91d75b1b2518dd4550a4473e48499c5a92fb457ad30aa3943fb505c14649e7e1c73824a409b28b62cd7363d112292325edefd2f03c936d84995bd6a9d1654f69ff2305fddcef8421c6fa5e95e0804d21326f29090661e8b7d29acad4ed70088e0a02d9e0c20ef28bcf6c6e37f0ea5e8d101018274b1a9581cb0e4ffc249c6ff21507ec348c2b295e0a78295c70db6da3f61e3e060097394d4dd297c791ef4b56be9b01a29139fd0b69e035c332179ab95b905fa9206a6469c25f5b040e6d41fc75c41af2551b1e653bb4cdea718bf56be7aa323ffa7caea162d9737f25854562a0e86ff89bb5933016132a74321b229255a7722120b1cabcc76bdf4bab94b18a321414558f4363d700eaea6b036f292ab2ccc250a1acec76075af3157ad8e301d6c8a38a4cf5c3de2693876f0454db9353919500d13528f47452c4986d3fe2629a3449e8d878f64d29b34b275e4fe742363f99640c3fd23b3d389f23ffdb261c466726dbbcb3c34afa274b28901d1ad577fd38c81fb19bd7550062bb85d31b513614780a02b6b5e3b5b7887a79b97532d503b43d1c7c48c96829feacef3c031665551659f32875674e20f38721cdc1e641ce9fe4e9dfb9e42bf08fc28ed0b03ef218d0b0e127b5046a9b965d8287fc07d20d688150ca006c79be06c7fdc9bb7910613ff3b5ba73d67e8dd2657407b021cdbb78ea5106f1646e9fab0fe2816f78a750ded955e761ba85c819d46a9e2a5ff21cdfc247b7350b0f8ecb1b82b1f991dba6d8b1e63cc69d4a7da94a552e695c6ca72da158fdd2260128890e396f7aa3b62023deff2db64c9a39b6030e9b39d99e280a4fec1683e09bb3787305d649f7ebb7bec1c75b1a6ea0259b734c14a0a2558a99db4acabfd497d51adfa4a46fac0c29d21fc027f0488fb7a2952e576fc9efa0c6f3bbb9725ee8556fb5ab129aa3e3ce912b2df7fc3c15463f649844144f62493b9ca098c5bca1e14e2148aea9ef0b851400b32db71827c0b0b5f8347f36f3e78f2f165f8e3fdea653ba81865efca377df1273b6a1f5df53aada0cc162aa096083a8ff62f6bd1096861fb1aae2851b4e55feb071284c12c6993dba58a4e938ec33d897b5333d67da388a69569a5762165ac069b0f9c00cca0bd1139c96e8265c865c2f8e7c39063bc077f795749cb6076df4588e2b2d07853a1443fcab992c7be89857a004fa930864687868405f9d06cd44a0122e2df619de0c07ddb7bd136ef66b5a49f7c6251915d5361fbf75d8acc6471b2aec8c0d8499c78ea80511fe930ed6f8ff4406b5c061678c0e23dc998804dcd4c7fc166356e536d84a59bc35fd2c111c7aac8ac8c29f5310f40bf0161bc7950978b886f0ce03e2e053e0d426238e9401c126d362e59556ff6bbdd7886000b65fde3390be7c2e91df00f2e15bdf77fc84040f705fe1756c4402679479a18fea45b24ac145764d68c03b2ace1ad2a40c67b027b5a81c8e29ac5d69ea33c39e236c7f906f6a8445b7a88ddcedc5d7a5b3326e9192aaa4b13e12469a21b34c6709660dbbe4844ff9aab8c1af58a076ce7dbe92a63aeaa409de0aed0d76b0da0578f55c4d6cc5b77637710c3498c8cc4718da0efefb279511b4a026d613e50a3fa51401fc786f81708e619a9369b6d9d5daea06836850917d835304fa3d6dbb4dd72ac7e624587ec2437f466db42e2d5c8bb03eb389c0482c087b6c2ea1e81f13a0b3772e452c3d640583c9705267c10d4d5f88f8322d2df8a55ba2b2fd5c7cb1b905a0c2822bd46d86e73018d96953491224866bf73b315490b2cacc59a13c14ce68372fc66c6f76a3ad62c9cbf734bf90b44a0c04f2f7545d501c91ced47854b3a5d3773420c653558b73d3c59d7d3c1689db1782f2ef33fe06b7418229a34768351cf11f61eef9f3839d3e5530af4d089305a32ebd80c97223b67047148a36d8c3eca73f31f2d94c04d70e89173ee68501de0c945b74530795598204e145adc81502d83c2944ecc9a6c42db1d7cd91682e05051e93f714505d75c1553d85e4217ae2af8f40110cc1dc88a3b34653871ecc50420cedba771ff2502b58f3bf353d62b68c365f4c7a6603f3c2a238d3e98594f1ba6e1b08eada2918519a628a45ecae4b17fb39ec117fa16c9448fe1d21645120ba850e71e2947b54cf87c599a6a2827263640041367784ec51b9c37cdbb3627f76f21955d9876ea0283ed22b5a07cec34792d6f9dbb505184eec9ef7f35b8237fdaf2b05fad8d98ce61c635c10fb5d803f9096ed9c7205b421482557f2f7c6807df1f893568181371df13935446ce065beb87a55c2dea524b53c6d4fa06a7806e31ddd78bb4704c5764b66c793128a76b159d914f5d76543df761e1db72935277f57a7a7b2ab9e7fbee199d6b4638094cb89b66fbd8c82e179f53234e5abb6ec764690885115cedd1677f5c8b2887ad48de4af560fa3fdcf7350cc5e6b6b90a23541c6174d906278d63a7b850380c412984e8b16aceb3971f832e85ffeec27da4a05c46811bb9dc4f3693f6036a1fe551da2d57544f4c85708b06f137692d30fb2146cdfad11a65ecc4e0e1afa9f25ff22858b14efbec3557074fbbf067122a39370193dfeb1b41e38b24701506d64986a4cad8853a2a39028e29f46e08b4ea0a88d180c6762ff166212ce8280c6ae78665f9c70803a313030a3e69c41f93f246738e7d5f9862f9f1d126a5fa1d67b18c6a6480c8ee7f5f5b5d24740b6d55fb64acd9435b7d0b6e13abc83a76e075387f6b93296293815504948933d97c33edd95a62f0c28db4d179e49bafceec7973b5657285a7eb9420b22caad226aa8b055495eba5974a94b17f3c18928539f7f4b03e140aefb83f2d5c2b96f74bd2689ef465777f03672d0d744f2aa232e851e5da6dbbea3ab5948b65a60872de801be0665553d27f8b831cd1769bb4cd61140cec1c9bc6677091656eff149a9546ccd453beb00c4a1851f7a67921978c5ee2ca83cc84ad7c5687c556f227f97a6271f072cab034052b22046be0bfaebad6df055d007fc5d7b6cc63aacf4ec075a0e93fc4adf32819397db79d38193450e8fe88e8effb71030ce29e62d64497c1198f8190d3b8b25c8eae993fe86e3ec3519a7a56d533462bf20b7066894af483442d6145cd3702592f6ce789526904b9a916e1c26462338ce9dabbc4ced46be7db7203dbbb84a3bd575a5ce2a624141e7d57ee41481a24d9fce04a6597a376d843ec7f024393bfa4f043a3f0a0ee18c5c8d990cff3c9b6bd7caca182fdf365d03983d95c5bf21bd7cd1929e57817dcb8d82e932e9d4e293f7c7adbded7646c56728c99afde5bdd68e219a10fa986766ac55ba1f05e6e73f0ca5df6826258eb31d002bfd3e0500171cdc9f0dd4fcb9955a058f83b15444ec721c431b9dbf103c252bb34ff11e2eaf153ff5a061dc20f386297e36a7f3ca746aa3a135e479e0ba55cceedb69a7f7624fa975e048d763b3fc94aa7d96da972ddee7f91b7f00d6c1cfde389f4ab05c799aa106556611cd123a26ff6a23a4057a3b2ff2569dd14605968e76993965b7211c5b7405ff5c89cdcfb36283f7fa82ff1da9e26d0269fac8daf9015b93b3b536c5b00a2c7427e199d9807be9893b67f03a9a1970a1a046887e0a8dcf4e6a2cee57ff26b8a664f6c836b28b20082d0387e02d6d42adb8c5f126668c2292cda1123b85e39ffbd389d832138eaa1500b06f16b0d0e5505c970152194e30f8bc3a2ef01385533daec68f3246ef72956036ba3aead3d62e879dcacb7f505698c6687996ffeeefe7d2a0c3648968aec1e2b864a9b36b8f08211e8178883a27a079fe072f08ca49e5ef1ab910ff56ac7d4db6a0e25457c230cf920acad2698536ad3c6bbea096729e2687057b1d998103c0dde7df3d699a35e5b7a297dcae7d42dc5e6a138adada3247fd200f3060be71eaed95f6e17039650bd67ed21569598bba030ca1063affaef3ad2f17d74d33508a3c74b0a9a536a7c4109ffb9bd1e1ab3ea36555c2522f1cfad903c8a51e91cdff895146b56b83fff4680123b35a193c106e845f575c9b983e338793bddd57a0c46acd9298508e556d242d62cdb45e9c0f9bbdcce45a259ae0ffd57dfeaf85c64351e0cf392c4220a6d10c7e178ef8a88c4c1ad63c131cd92df268301730bcfc01f14882e51e9826b793fdfdf5f14ce7c44c59ed399e3a56ab3ede222dccd25736b85ffbf267efd69be2ad7e07a9b6360dcfee822e70f188722d0443239533c664b51d9d6bf46ccf8087116d5baf8dd6e0077800d84c309d7d749851f45d5f843cc369c00fadee5971af41f9451fdcb24138a1f19b9d3f166d6af9a4ac580b8b38c3ae8f0822640222d3563c611071c5ed0d370566ba597913dc6beed7470d7530b1b8ed213a3e6f37b15983e63f61de57cf0996250af0cb47c8c2cbe374678edd248d14f970fbe3c24a0a35a08b517af001b7fcf8cd9a01a4e909a1247600880a0db14025908498233325773bc70c907bffe93a537d60ef9590641987f23e28bf77550609aba6d5e1b13e79b1990ac9ab8b70e96ccf1c7d685606ea0194b40c68e3fcd64b3da521b770052221807de6c4186166a9d7efed120c978fcdb8380d5be361fcb52b5728831d367f29a8879a61d7eab88a95265b583c44068374cd3f26c23a1c62cf33b8f647c9891733ac9428d675510a6c9dfe5b0489c446a8601bd14bff6f637cb030b4dc60f8b17af638ac775a9339d7a4334cee79d830d735d3186adbc52e733f3fb410d20764d418f3863ed2acc874ca4be1aa47df5c24692638d703df3dfa0c7e7a1f3e9993b8f0e7607b4969532a97dcfd30531b19fc76c331b676881217067428c1403fce556557baeeb389b4146fa043d49680239df3182fa576d48c9d40492c78d029d149f1 + 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark{restore}if +%%EndResource +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 239.76 C +ski{/Helvetica fcd /Helvetica-ISO8859-1 fdf}if +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<534f52542063616e2062652072652d636f6e666967757265642064796e616d6963616c6c7920627920> 146.88 238.80 C +<747765625f736f7274696e6720582e35303020656e7472696573> 146.88 267.36 C +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 311.28 C +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<446973706c6179206f6620656e74726965732063616e2062652072652d636f6e666967757265642064796e616d6963616c6c7920627920> 146.88 310.32 C +<747765625f646973706c61795f3c545950453e20582e35303020656e7472696573> 146.88 338.88 C +gr +%%PageTrailer +rs +%%BoundingBox: 18 18 555 759 +showpage +%%BeginSetup +%%BeginFeature: *PageRegion A4 + a4 +%%EndFeature +%%EndSetup +%%Page: 11 11 +%%BeginPageSetup +/#copies 1 def +sv +90 rotate +1.00 -1.00 sl +18.96 18.00 tl +%%EndPageSetup +%%BoundingBox: (atend) +gs +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.72 537.84 t 66.72 25.20 lo 66.72 25.20 lo 66.72 537.84 lo 66.72 537.84 lo eofill st gr +gs np 66.72 537.84 t 66.72 25.20 lo 68.64 25.20 lo 68.64 537.84 lo 66.72 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.122 0.122 0.122 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 68.64 537.84 t 68.64 25.20 lo 70.80 25.20 lo 70.80 537.84 lo 68.64 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.247 0.247 0.247 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 70.80 537.84 t 70.80 25.20 lo 72.96 25.20 lo 72.96 537.84 lo 70.80 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.373 0.373 0.373 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 72.96 537.84 t 72.96 25.20 lo 75.12 25.20 lo 75.12 537.84 lo 72.96 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.498 0.498 0.498 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 75.12 537.84 t 75.12 25.20 lo 77.28 25.20 lo 77.28 537.84 lo 75.12 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.624 0.624 0.624 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 77.28 537.84 t 77.28 25.20 lo 79.44 25.20 lo 79.44 537.84 lo 77.28 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 25.68 t 67.20 537.84 lo 80.88 537.84 lo 80.88 25.68 lo +cp clip np +0.749 0.749 0.749 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 79.44 537.84 t 79.44 25.20 lo 81.60 25.20 lo 81.60 537.84 lo 79.44 537.84 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.000 0.000 0.000 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 98.88 lo 66.96 98.88 lo 66.96 98.88 lo eofill st gr +gs np 66.96 98.88 t 741.60 98.88 lo 741.60 100.80 lo 66.96 100.80 lo 66.96 98.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.110 0.110 0.110 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 100.80 t 741.60 100.80 lo 741.60 102.72 lo 66.96 102.72 lo 66.96 100.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.220 0.220 0.220 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 102.72 t 741.60 102.72 lo 741.60 104.88 lo 66.96 104.88 lo 66.96 102.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.333 0.333 0.333 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 104.88 t 741.60 104.88 lo 741.60 106.80 lo 66.96 106.80 lo 66.96 104.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.443 0.443 0.443 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 106.80 t 741.60 106.80 lo 741.60 108.72 lo 66.96 108.72 lo 66.96 106.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.553 0.553 0.553 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 108.72 t 741.60 108.72 lo 741.60 110.88 lo 66.96 110.88 lo 66.96 108.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.667 0.667 0.667 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 110.88 t 741.60 110.88 lo 741.60 112.80 lo 66.96 112.80 lo 66.96 110.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 67.20 99.12 t 67.20 114.72 lo 741.60 114.72 lo 741.60 99.12 lo +cp clip np +0.776 0.776 0.776 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 66.96 112.80 t 741.60 112.80 lo 741.60 114.96 lo 66.96 114.96 lo 66.96 112.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 494.64 lo 94.08 494.64 lo 94.08 494.64 lo eofill st gr +gs np 94.08 494.64 t 395.52 494.64 lo 395.52 496.56 lo 94.08 496.56 lo 94.08 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 496.56 t 395.52 496.56 lo 395.52 498.72 lo 94.08 498.72 lo 94.08 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 498.72 t 395.52 498.72 lo 395.52 500.64 lo 94.08 500.64 lo 94.08 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 500.64 t 395.52 500.64 lo 395.52 502.80 lo 94.08 502.80 lo 94.08 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 502.80 t 395.52 502.80 lo 395.52 504.72 lo 94.08 504.72 lo 94.08 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 504.72 t 395.52 504.72 lo 395.52 506.88 lo 94.08 506.88 lo 94.08 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 506.88 t 395.52 506.88 lo 395.52 509.04 lo 94.08 509.04 lo 94.08 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 509.04 t 395.52 509.04 lo 395.52 510.96 lo 94.08 510.96 lo 94.08 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 510.96 t 395.52 510.96 lo 395.52 513.12 lo 94.08 513.12 lo 94.08 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 94.32 494.88 t 94.32 515.04 lo 395.52 515.04 lo 395.52 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 94.08 513.12 t 395.52 513.12 lo 395.52 515.04 lo 94.08 515.04 lo 94.08 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 130.08 497.04 t 130.08 513.12 lo 360.00 513.12 lo 360.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Times-Roman fcd /Times-Roman-ISO8859-1 fdf}if +/Times-Roman-ISO8859-1 ff [13.68 0 0 -13.68 0 0] mf sf +<4b757274205370616e6965722c205a44562c20556e69766572736974e4742054fc62696e67656e> 130.08 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 494.64 lo 411.60 494.64 lo 411.60 494.64 lo eofill st gr +gs np 411.60 494.64 t 571.92 494.64 lo 571.92 496.56 lo 411.60 496.56 lo 411.60 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 496.56 t 571.92 496.56 lo 571.92 498.72 lo 411.60 498.72 lo 411.60 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 498.72 t 571.92 498.72 lo 571.92 500.64 lo 411.60 500.64 lo 411.60 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 500.64 t 571.92 500.64 lo 571.92 502.80 lo 411.60 502.80 lo 411.60 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 502.80 t 571.92 502.80 lo 571.92 504.72 lo 411.60 504.72 lo 411.60 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 504.72 t 571.92 504.72 lo 571.92 506.88 lo 411.60 506.88 lo 411.60 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 506.88 t 571.92 506.88 lo 571.92 509.04 lo 411.60 509.04 lo 411.60 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 509.04 t 571.92 509.04 lo 571.92 510.96 lo 411.60 510.96 lo 411.60 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 510.96 t 571.92 510.96 lo 571.92 513.12 lo 411.60 513.12 lo 411.60 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 411.84 494.88 t 411.84 515.04 lo 571.92 515.04 lo 571.92 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 411.60 513.12 t 571.92 513.12 lo 571.92 515.04 lo 411.60 515.04 lo 411.60 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 456.00 497.04 t 456.00 513.12 lo 528.00 513.12 lo 528.00 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<31382d30312d31393939> 456.00 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.702 0.702 0.702 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 494.64 lo 585.84 494.64 lo 585.84 494.64 lo eofill st gr +gs np 585.84 494.64 t 740.16 494.64 lo 740.16 496.56 lo 585.84 496.56 lo 585.84 494.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.718 0.718 0.718 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 496.56 t 740.16 496.56 lo 740.16 498.72 lo 585.84 498.72 lo 585.84 496.56 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.737 0.737 0.737 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 498.72 t 740.16 498.72 lo 740.16 500.64 lo 585.84 500.64 lo 585.84 498.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.753 0.753 0.753 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 500.64 t 740.16 500.64 lo 740.16 502.80 lo 585.84 502.80 lo 585.84 500.64 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.773 0.773 0.773 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 502.80 t 740.16 502.80 lo 740.16 504.72 lo 585.84 504.72 lo 585.84 502.80 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.792 0.792 0.792 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 504.72 t 740.16 504.72 lo 740.16 506.88 lo 585.84 506.88 lo 585.84 504.72 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.808 0.808 0.808 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 506.88 t 740.16 506.88 lo 740.16 509.04 lo 585.84 509.04 lo 585.84 506.88 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.827 0.827 0.827 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 509.04 t 740.16 509.04 lo 740.16 510.96 lo 585.84 510.96 lo 585.84 509.04 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.847 0.847 0.847 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 510.96 t 740.16 510.96 lo 740.16 513.12 lo 585.84 513.12 lo 585.84 510.96 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 586.08 494.88 t 586.08 515.04 lo 740.16 515.04 lo 740.16 494.88 lo +cp clip np +0.863 0.863 0.863 RGB +0.240 sw +[] 0 setdash +0 sc +0 sj +gs np 585.84 513.12 t 740.16 513.12 lo 740.16 515.04 lo 585.84 515.04 lo 585.84 513.12 lo eofill st gr +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 656.16 497.04 t 656.16 513.12 lo 670.32 513.12 lo 670.32 497.04 lo +cp clip np +0.000 0.000 0.000 RGB +/Times-Roman-ISO8859-1 ff [13.92 0 0 -13.92 0 0] mf sf +<3131> 656.16 509.76 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 46.80 t 107.04 80.88 lo 741.84 80.88 lo 741.84 46.80 lo +cp clip np +0.000 0.000 0.000 RGB +ski{/Helvetica-BoldOblique fcd /Helvetica-BoldOblique-ISO8859-1 fdf}if +/Helvetica-BoldOblique-ISO8859-1 ff [28.08 0 0 -28.08 0 0] mf sf +<5457454220446973747269627574696f6e> 300.24 73.92 C +gr gs +0 0 t 0 559.92 lo 804.96 559.92 lo 804.96 0 lo cp clip np + 107.04 198.96 t 107.04 397.92 lo 741.84 397.92 lo 741.84 198.96 lo +cp clip np +0.000 0.000 0.000 RGB +%%BeginResource: font StarBats +%!PS-AdobeFont-1.0: StarBats 001.000 %%CreationDate: 09.09.98 at 15:50 %%VMusage: 1024 36745 % Generated by Fontographer 4.1 % \(c\) Copyright 1998 Star Division GmbH % ADL: 917 200 0 %%EndComments FontDirectory/StarBats known{/StarBats findfont dup/UniqueID known{dup /UniqueID get 4092170 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 20 dict begin /FontInfo 16 dict dup begin /version (001.000) readonly def /FullName (StarBats) readonly def /FamilyName (StarBats) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -133 def /UnderlineThickness 20 def /Notice (\(c\) Copyright 1998 Star Division GmbH) readonly def /em 1000 def /ascent 917 def /descent 200 def end readonly def /FontName /StarBats def /Encoding 256 array dup 0/.notdef put dup 1/.notdef put dup 2/.notdef put dup 3/glyph140 put dup 4/glyph141 put dup 5/ch5 put dup 6/ch6 put dup 7/.notdef put dup 8/.notdef put dup 9/.notdef put dup 10/.notdef put dup 11/.notdef put dup 12/.notdef put dup 13/.notdef put dup 14/.notdef put dup 15/.notdef put dup 16/.notdef put dup 17/.notdef put dup 18/.notdef put dup 19/.notdef put dup 20/.notdef put dup 21/.notdef put dup 22/.notdef put dup 23/.notdef put dup 24/.notdef put dup 25/.notdef put dup 26/.notdef put dup 27/.notdef put dup 28/.notdef put dup 29/.notdef put dup 30/.notdef put dup 31/.notdef put dup 32/space put dup 33/exclam put dup 34/quotedbl put dup 35/numbersign put dup 36/dollar put dup 37/percent put dup 38/ampersand put dup 39/quotesingle put dup 40/parenleft put dup 41/parenright put dup 42/asterisk put dup 43/plus put dup 44/comma put dup 45/hyphen put dup 46/period put dup 47/slash put dup 48/zero put dup 49/one put dup 50/two put dup 51/three put dup 52/four put dup 53/five put dup 54/six put dup 55/seven put dup 56/eight put dup 57/nine put dup 58/colon put dup 59/semicolon put dup 60/less put dup 61/equal put dup 62/greater put dup 63/question put dup 64/at put dup 65/A put dup 66/B put dup 67/C put dup 68/D put dup 69/E put dup 70/F put dup 71/G put dup 72/H put dup 73/I put dup 74/J put dup 75/K put dup 76/L put dup 77/M put dup 78/N put dup 79/O put dup 80/P put dup 81/Q put dup 82/R put dup 83/S put dup 84/T put dup 85/U put dup 86/V put dup 87/W put dup 88/X put dup 89/Y put dup 90/Z put dup 91/bracketleft put dup 92/backslash put dup 93/bracketright put dup 94/asciicircum put dup 95/underscore put dup 96/grave put dup 97/a put dup 98/b put dup 99/c put dup 100/d put dup 101/e put dup 102/f put dup 103/g put dup 104/h put dup 105/i put dup 106/j put dup 107/k put dup 108/l put dup 109/m put dup 110/n put dup 111/o put dup 112/p put dup 113/q put dup 114/r put dup 115/s put dup 116/t put dup 117/u put dup 118/v put dup 119/w put dup 120/x put dup 121/y put dup 122/z put dup 123/braceleft put dup 124/bar put dup 125/braceright put dup 126/asciitilde put dup 127/.notdef put dup 128/Euro put dup 129/.notdef put dup 130/quotesinglbase put dup 131/florin put dup 132/quotedblbase put dup 133/ellipsis put dup 134/.notdef put dup 135/daggerdbl put dup 136/circumflex put dup 137/perthousand put dup 138/Scaron put dup 139/guilsinglleft put dup 140/OE put dup 141/.notdef put dup 142/.notdef put dup 143/.notdef put dup 144/.notdef put dup 145/quoteleft put dup 146/quoteright put dup 147/quotedblleft put dup 148/quotedblright put dup 149/bullet put dup 150/endash put dup 151/emdash put dup 152/.notdef put dup 153/trademark put dup 154/scaron put dup 155/guilsinglright put dup 156/oe put dup 157/.notdef put dup 158/.notdef put dup 159/.notdef put dup 160/.notdef put dup 161/exclamdown put dup 162/cent put dup 163/sterling put dup 164/currency put dup 165/yen put dup 166/brokenbar put dup 167/section put dup 168/dieresis put dup 169/copyright put dup 170/ordfeminine put dup 171/guillemotleft put dup 172/Tom put dup 173/Pete put dup 174/registered put dup 175/macron put dup 176/degree put dup 177/plusminus put dup 178/twosuperior put dup 179/threesuperior put dup 180/acute put dup 181/mu1 put dup 182/paragraph put dup 183/middot put dup 184/cedilla put dup 185/onesuperior put dup 186/ordmasculine put dup 187/guillemotright put dup 188/onequarter put dup 189/onehalf put dup 190/threequarters put dup 191/questiondown put dup 192/Agrave put dup 193/Aacute put dup 194/Acircumflex put dup 195/Atilde put dup 196/Adieresis put dup 197/Aring put dup 198/AE put dup 199/Ccedilla put dup 200/STARling put dup 201/Idee put dup 202/nbspace put dup 203/Edieresis put dup 204/Igrave put dup 205/Iacute put dup 206/Icircumflex put dup 207/Idieresis put dup 208/Eth put dup 209/Ntilde put dup 210/Ograve put dup 211/Oacute put dup 212/Ocircumflex put dup 213/Otilde put dup 214/Odieresis put dup 215/multiply put dup 216/Oslash put dup 217/Ugrave put dup 218/Uacute put dup 219/Ucircumflex put dup 220/Udieresis put dup 221/Yacute put dup 222/Thorn put dup 223/germandbls put dup 224/agrave put dup 225/aacute put dup 226/acircumflex put dup 227/atilde put dup 228/adieresis put dup 229/aring put dup 230/ae put dup 231/ccedilla put dup 232/egrave put dup 233/eacute put dup 234/ecircumflex put dup 235/edieresis put dup 236/igrave put dup 237/iacute put dup 238/icircumflex put dup 239/idieresis put dup 240/eth put dup 241/ntilde put dup 242/ograve put dup 243/oacute put dup 244/ocircumflex put dup 245/otilde put dup 246/odieresis put dup 247/divide put dup 248/oslash put dup 249/ugrave put dup 250/uacute put dup 251/ucircumflex put dup 252/udieresis put dup 253/yacute put dup 254/thorn put dup 255/uni20AC put readonly def /PaintType 0 def /FontType 1 def /StrokeWidth 0 def /FontMatrix[0.001 0 0 0.001 0 0]readonly def /UniqueID 4092170 def /FontBBox{-12 -210 1083 917}readonly def currentdict end currentfile eexec +d8061d93a824650eefe2785f13cd28a8a226cfb0a1a9915b91e00d2c2cb80ac548a1ab21bed4518a56748942842eff6121b01bc269e7837046266cb27dafd3a4fd0344e68245aa98a5f1b5bc9db554ebffb879f1c082989cf6c044b76f4814df51dcd03f9e3397f3c73d94f85771983bd52fbe6ecbcd9a2cbb7b3636cfb819daa5469925fc89a188732d68c6d06c906d183cb4bd495aed0c41fe6b7333ad90a1674478062c8996476573a0cdad62593c86e4741ecab7b8c75a6bf02971dfdc2c5a2e1c8f74ab1e91315c54e72426da3a62dede611d5967201fe8bfaa5a21c612c0b245fa35c6706b7b9aa3f73ce16604e3109770d367fb30fa663aa8d2b246de733d27174a0b818d54c58c3676435d43949eb9e5e335396296bc3f096fc154616c0b723b0b4a100ed45072f371f77f26e02f1dcc41376638097d79af0a4ddbfc37dd6cb60d0d34ea5a7536c655d95549b8a5a269e7e927c3d89f74b88e17973c2e8d64688089d329abe6b1009c0334d57a6dc34f22efdd933023231fa03fc81093ef255a199448f17d8f67dbc57c38b2fa163b8cef97a6f42e74af55319eb81a6fb9de18810ba9e3659a7144b80aa066a9f386de3030fc4985efffd13c0cab7049a09a71dc1dfa21a1540f4289b13dde08c0d3b4a01fd2bcb4e256b398c94036935bc270713a24c51042bac575ed4827e17e5dc2997753fcee0ecaaca582c85518edc0c3dee2851fa4d2581f7b399f07013ca3d1d4702cc27be134cfa8aa1cbfecac76f1b406b5b3126c3b7b60ec34340aac6433997656b3dcc1af6c8036f051edfc109a493243546721683fe5c0e48790848079c74ea0640c3f9c92cdd22fab8af9b5575a5d1d2cea0f1f715505cb02a1e200cbe4ea5563d0475cb13bda929286f9c11eab10ddd676314996954ae3c94bd14f364d5202e6ddd20b1b4c7abec1c061b2d8a1776577387a2f2dc424f56d44e58b96f91f7b871627089498d76bbc6664e1ebc9b26486cb727d4a5d62fe405324ceb0a5dbf51c9619f2913e4dcea44c5bac49d74bd049f28b83955e13f0fc77d998a307b0bb560757b21e4a982b59cd5723d66952b8a7ad0311ee6874842f454046538c475b86983b4b8d9c00e814009235a058f6d5fca9e8339555518ba2b64ee925cf0944deff5c14069a1ee1de2cadafaa6421f495c21c042690b3a7c9e6a5a137ee005240308e63e0b1d4bead90ec607d19c57ecc24c2ea9b8ed4af8e5ec19575ba230c19156ff9b23915a7b50666ec4b655a2946f97c5013cdfc31825f2c1040fb28bb8876b1accb1fc005010e5e5d061651dc9df17b7bb37c495a37df9659962680951290f3f4168dffb294f83b2a3c423526a97451e2504fc0c819f4d263834ef7c8588ea4d68c98eb5e3ee3c2de20a6da219b3256400a7c745059581d33158a505d5bb07c75bda324c2d8fe34eadb98520c7b82838835e92ddd1d89516478cb1ca795324f802e1f7a5547f671588fc3e5b909f5ab9d573bb0766569a36e89586b7410b76867cad6577022e9be567d1a5578361d83b817fb994758c679fcfd6b22c9fa7c6c76f2a72be566e42167247c831f826d9a10e03874b9747783adece88750be1206a07923cd9fe06b677b61c69a7dd9e0f9dc60771ac529f6adaeee9ee6652cdeca5789c7f242266d86f0154a1984402c720adbc3dc79b6eece6d378555d78873844ba1cf057f385e70474132e0bdfabe169a631e07d12fd21f18736013499081e58d72e9cd451df304a5bf52c1f1723a5ec8b7992d8fa3f33d5be97d4c114fd435a94607f8be09812bc1fa4db028644e2fcef5d86ffb947a14993a93185b054a7cd9ad734c62f2d9ce3c0f9e2e8678bae5b92315f60169aa85d4ae22488cfab72b841374ac3f39966b9e126ad64c0307b54085b6e25d51caef51fecae4c5ddbfb5c29b15cc90ec0795123a84d3c31173b49096d617707d9e192da82493ac9884759115c02ba4686ed464d523aad69167e24e5303ac3eb3da0eebcc420fdc256cc26d466f979c8e637344958f02ba9d3a481693fbf13283d7d276af546abf2f2bb4e6c6f835c97e532bd5b40e8b08eea4441e8a9e03021add36c4fe28180ea466082e4fd7facb03f7abd47c929c4e0d84132835e59f8276ac7fddec7755cba924dd1c97e02691f13f2e159b1e358ef2ba347e2298b0b39f5ffdab57daae22d94ba5064abf716c866b64add8e3981b76a77a3a8be0a462594b9e1257e7940b237875e000c0e23a0841a85da6eb5af931dc0ddfe912285d160f12a66ebc8717fd37c13d20cc132218d31680d596ffbbb2f2805fd931c61693bcbe365f0d19c8fea4ff3eceefe09c5e29b7fde3782b8adf4bb1aa7f89ce01fa59d1322a1ccc4d92705e274bdc287312b23ab830968143efe12c8d4ac45e0c72c11f630eb5ae0c835b7f7d32cf261c20f04b7df8e362cb15cf38c531a3988afc8eb957fcee0364049ccc8d8a6935200970293486bb69db1969a2aeb39829cc4bed803e0c266c77b0dffd349ff9ae8f95558a3977775b1bc2dba5be54800a9e9645155315b062d0b5a0491cf90a66e84b581070f30d5796f71e88db0352432e8df588d25c9c9b2dd12b976618551d5625e357737966d9a15fe3cd9d54bc275b6f5993ecfcfbb373c419e2f8ed32fcd56d30db1345987a445ad259e03053244a1ff80c9343538c74845a907b0480f013289cf475df6c989a81aa5ba904a63db328292553fd4fc3a783fb76ee6ae50be4809ea0aaac9a9ba429c9990eb45affca8587972c54fdd677cd14f81404c77e4358212f44826316a927983c968767e7be1c7a36f308b6cab1648780b4f1a568cbb0ea49f6a6352d6ab18d54d442c176037ad16e18a17d88cd8fda7e86895c89368239f0f75f8c26f850316a328c40efcf316d8829ddb0fb69b250e41b94144e0475acadf63e51f27f6ecb6af4ed78ddce68c055b7a1f78ec1174bf9d67f54838da11655980a909ae1b80a2e6282137c75e49d703e6d5b4be616e62b020a8d08efd14912337a75857920f1d3515ab2771d38d8d8f610c9801d0b0c8d3388c75d211ac4e4c0c491d3b70e1bf1b926a6fabf60487613e76e6f779c4aed60929561ed06c676de7d5052f60db62e446ca4e2775b966f74a2ab55466ecac93c65e48d5e6b88080f24534ca63dd1e6781920be3010f3e9ceb771c5509754ebf963de75b4b9c9116ba7f4e21d9d89d2df167d8c5674b2fa61f49f016b4269e602c6e144de4a382fb7f185dcd82942081d6362f335695587d2ed1071a70bb27d51200a1de03763bec6b2c7a86d8f200505c07f25fc6be9c044110607154cb69efcbfce495dc86dc634e20349712d3754ce99a8b33cc59ce272e39f481b729c878399e51976652b4a525d107ebbd809909ec95f07f2012672601eb9ada5e0b3292d68b6ff8d529a2dcd23f7150d77ba5b1a36701d5954d37ee96501f9efa8e037290f6dca8c024ec0a2ced95b8dcbfea0ddc55dac8ffa55e224d33fdae74502f8f0085fdb5d6d031d34a609db4ed63ceeb285f3697049800bd560e31bfdc6862a49da0ff4b4e84bac9f184e08181c7870058559f826977e851f7dde09163b8b3cc82be8103f7baea3072202ffce888f1bbe37cadb748e2a3b3b53cf38b4336a4eadd0afffd76389b1dd9d067888c4e647b07a7643b81fc08a15872f08f6295eb45e7838021253432f2bdfca6c2a85aa70efea06863d3ebfdc555f41abceb6fc1a5f92448e917ae97706dc04adf0b7bc817c1b93d2f924b118fac5fe6053093401a4676c6d7ce7b4ceae1f5c149b1d8d712d32d56bc8430c210a7124e192e387ed9696df38ac2763e3a065c3ae4726afe9c16b07891bf5243c16add2bf494f9ae8b7566d4ee600a7fcc945d4bdd305daf4df51b1c0222e5594c65af003b51549e0e790ef194943d4accef39419ba173d05788ff822d4e3d4fb5a612fb13292aa377e50a44a6953bb793d0c521c2179012a882b74ece2f79723fb75624ae9c446ba358a3effd738ccb59a856f1bb5afe8635e1033936d58da18ea1f7464758e4647ac03552bcd1be22ef9d4c0f4aea0d7d1c91234ac50d5192bda73b0e63a8303ee284009e6f42c0a8671cbac1c02ac67f096cdb67e83a8d3a8b0e2915fe4e498d50a80892a374cf637cbdc145c2a4a16e0449fd300f7f03b9c80b320addb404d3b7388e5473a6502c74a9d614b21f2526b2e4f9fd9c5adca0f01677b57de5a55d60d9c428c6833d7abb14514926e09bba6b07763aad75d0a934b7c44976be43c289fb238aeff7556183515a5c4b085447922adff5498d29e101a60ff02e893ce8fb8d446874914eb3d3009db46a579d14dfe884d22d9ca5bfde436f4bf334c8c8e73cad66d26b9b711b3a2a3ea84d6864945e529bf59d397ed0acca03a3bb32e470c46cd6639cdae83b4e8e6decd2e8574e1b9361e2600bdccd6c9231ddb2b5981f4148984e0d21d2bc7c54fa7b32144192d32a60bb17520e855b14ea6ba31068d4e209a5add8dd6cec44932063adac2280f985cc70099a1fffb3cdc3134604bb8e50ede70ce9db412a309a21a0541662050f545cf6f2fbb39e9106e83d34dd1a7f9f08b66e68052482a68778687aac8b793ca24cf3d258d7991c4d2c0eb760d1b83dec08277bce87bef9883ff7af63a927a509eb44ffdf2f8f2a529baee6c68478a1f8a10c81fc3fe0a88004843f05d15b34d04149508d7b29ff2b11ad5e150269dd78545f0f57ca1752f6197a8539ab3aef587645b5dda3dbf18060d30c3426f2fff04d9bf22f1591762597d72cd6225f01377293696235f084801440fb9590bf6468e73c11d7de5c7c9899d6a84a9bbe18c8238e117ae4e74ce9c087957935630399f186f4712caa2775ee026f1c9f334bfa2ea897f2cef8f6d2f200bb2fd7d9292c056149cb3091d54be657c5efb690dd7290b7f866330d8b64cdb134019ba3c608bebca348fac2ee3891d54ce18d427de0e8270ca0b19b5cb9ab69ff7bfce6b5c6431fc794f1a2ae04975dfca6d865e38a85d0092b339119f43ee8f11f999ff0132145ef65f2786d9dae9c45dff0ff2195bfc604db64e4da4b681dcb6a3e2be4f691bad02abb6347e7ffb00172df452182679d10029a878d14569825c6df61c229e158f92a6a0e0590722313729ecc3c93a9de9f044e62d3abdf500ea46557e90649aeb8cc582bfb6fa71042b330800d50aebe27e1b7605c3aca1f67c4116d93a1d59d7f9a9d7dacb2c949193b0e901291474ed0f6b746c680b337ccc6adcccddfee2ba9e31f588940931c6d697222b14220ece34f97d640f78eafe33d689d8c5e94ba3eaccb197728d58924f1325c5951246898b2477057915ce4caea524151e7f3cb049441ae88014b89fe7730eed66c4161b2e01d608d977d674edd37527433214b40081ec8a262da3f69f07dd54acc3a8dc5058a927bf7ac5d3ff18e0e526cda9eeacc331cfecac11d2bec5872fdd5cff5f7459a42f263304294b139fd7106149b962873b757a2db3ee8e030a8ea3af3366fa5f3226d9f9de3c48dcc0f701ac74385d2b753e655804a834456e17ee576872bb5e9815bd6ab6a4555ce5fdcfd0b1637357424813dfa6443a46200dbcd46f7a15d342c14e5b99c1e53953283d83e81311eb2537162005d2bc0f18b336e33f7190d4cc4ab8a86f596ac2522b6fe3aec0befaf024e35f811a309c8a03734e432ac4695d977d6fc14c93773edfe0eab4b5a0a6d55b4ccd205086b92107a434b119d15f145d0f3511f823e69a4b3777b659555f06116cd99075982c200e36eff85d7931c7b918af5504bb4129cf65c8a33964b3b6fd3b2340fd3737c73f7667632cbf81535b88096e99a5e98ffee00409948eb2b46010a275ffdf345bc0e359ae4c2b6b804a36ec5018db1ddfd43ed28e0982be3dd61a41fc78221bfaf4eea3c94e8819e2d296a355bf61cc29ad69e2baa9caa77f4587be6bccfb178d553bb99bdf52716e6a8e2626505b819cc595f5173d13340fde8dbb4db3313a66348c8cf5fddfe7d7fd04becc8fec0ee1385ce5329088e772f1939fd59e2dce71c2946044fdcd131e06695ebfe5ae6e512640d0ea79492c20880391bffb1b3c9851cfba1b5b16d5860baa2a2b1f4e0a571aa3551cd73256e171c2590687e3596108defc56ca6cefb27095380b0bfff828d897c5f4a1f7710cc1fbe37ce9254c27edb772093e789a7e2a941d676fa8f14edf641dcb06fbd638e74a3764be77ccb7f93b5f961be59a6df0c5305b6ab3a20ead2d3eadd749fff40762a25833c9efbe377d2aae40b18e7785a77f9eb4f05f987ac7572854859f5fc5f56240e94305543baf5df3fb905a1122d20d09d7133923783f4d1e30ce9bc990e1d4989280cdcae75b5a78ff48ec68254373f9a57663255c0d5a18bc78b3cf2002befdf0cbb3cb5e76243b963e16ef7a34a06016dbd728117ed141ce213dae5acc96930ef9320938084dec3f77ee4e595b496648896de03deef6fcf49f6477a04a0b190fa668ecb8dec555db55d7ba7d0151042dd4f205e50f53ca706d93c9ae1b67b51989ad1b3ebb27f2416588397429d2129bfe0d5fbc7888fe0ca49754024224ba6fbd089214122d5c5dfacf7fe314c34581b80fe2f0786f7a70788a1dc27bce9f69daf04f197e9fe3f735a339f6f88067636e23559d1a02cd1d8b70fb07146532a5b404a4491d8650a22ed0f49088e86054e76656f079074ae121f5039c5a128109551c3ad7bfb874de16f639a82f0cae1ba1e26cb21bb8ab0ffd0fdda61da950d00e9a9d319c32757cceb80c07716cecf71f96dc167d760bcb54c8c41387d7fb8b5f884a0f7f53acced99690e1316a8f2005edcce538b3b511a637736a08c932fe9f54e281535c9ebe5716228cef9648813df7f0ce70b5107833eb4025e11f93aa574ca8215ce3dc6a5069f03f22a2224d9d2f8c819714b3b02f32066785f9aaf616afa69a3c031f1d1ece51d541f60d6b8e739b63b0f6472b93e5e34cbca3474b47deec1d72ddf91baaafa42078c177469e8099ef4a80758225c7839a0ba643dc3c88fb01ca0f278f077675f0f3bf3319931f129dbd9ef04dd0daa8cf8bc6573b6b2091b64326a366df67a739f27f8c20f47ea3bea9a9880b0aa3b558c56f6596b0f51b124b78b717336142cc03823f2d75c0ad84c09868cbd0dcfae4ccf37b345a26d5e08b20c36505447042ee2ce81f450a835d7e0b679c0c9eae37ef6982001a8c52708c5db0ec2294a90b9876eb789ab09af859a0a879cc27d2f52dde9e9a6960fca2530244cc26d3a21cb294458d707dbe2441460d79d1783fb334a3d144339bdd635b676a1b260f5969bf089d59a526f56bdcf92bbb2d52cb268ccca6c66e4ceefa57c72cbdf8a4e1a2b57ff356f8fa49db680fdbaa3d4df9f1d6201307a44a9ebef9ab8c893518d71beceba645d6df155f6aa68163f8d66b40c1084b673ac16b287f763d40db303c4c9f9e76a3e8fff77d595e97f7e59e56b02aa8f005d0c6830931892207e25a11520efbce320b99362de47e093fdd48318cef9458ab6b4093d1480ab1424e82695527412d0c5e3c299eac02b67ee503a9d04d31431d172f50666fa59e778dc43ffb7eb3f78324a5cd88601f7109bf3bc03f0256ec90473715c9a626a8488a4ac0403438c7fb97438334506f3718c262c6fb671cc1501e1616281c50c1f1abb0e796b5a989d9419e9146784619689562ee006255b58c5030d4deb7bd4e723d5dddced22c58905adb6a1b319ff10a8610912023c965c87e8b9f50babf746950ca2b356c1a9cc1cb8180a3536b2a639a147f65a8178fbe711c5fffb8fba62069c74e02ee7bb219bde7f581ed080e33ada55e37013823fbe5eaf8f7b774209a75b047e7626b8b82733f525e57792ca6c79bd882c5bfa323fc5ed98227c892ff958a359fcf654cb8facb6827d717a899ab9b4d2093e7a3762ba0c9f7ad55124173a5bb29f9f8769484f698dc8f8b394816dd74eff3b1a7dbdf16096bd0ad1b5bd409d56783b6d418631be43d241d6b834e1e8107bd9e296f9aa43e90ef753d6ad527875f230f6b1d3914692840fd51e8048ef5ecc8e7d2da90645c8e0acbdb3803d677cb07714a5fbaf0caa48234e6abfd0cc1be8a80ea7e956ec40a54ce712c979d9d108c28566d3c71c93c25fd7c202c637aa06f1baa00ed6262f87062cbc03e7722983a7c87645ad8d6e0df84112139cd220b03e3b874dea9b9705efa254db06927ab7951eb72ea84b253e0bb877b77fb1810b078ba9f20280d7e85fd9d134ee7166cb1cd51525a5bde7cf96b26569af11b40dbf5b4b25a662c9e14dc084cc349bf451cc976d1de3ef735d001c18d7e6027fdba88d29016ba395ab7f6b1d232151acca1ee234a287c2d7843223db3df6e3e5325a9fc82d92b0baa4a28fc927a3c3d307f7a7ca1ec7a54e8b4a56c177aedb633425bc7676a10c0c2d51b5555f4757c2c9908cf39eee8f85913216c5df40fc6a04dc460e99f55844700b4e02ef7a81ddf4bfa798e5ea327d2c66db67c608afb6ea5753ade25c620d52a5ff2c1d43385737d41e7e6cc645b1f9dffacdc0e8cf72a9128abd66cfe77f2c273e7efb2c6d3ddf4848a023911b7287797cb7a3baff8df5f4d8baf2d30d8ef3daa330fe4728f2fc405bf82b6360d1c9f78d17fe13bad721756ec2bba578702ab8a41c094b22a2ea393e9d4d597e5d0c2f12ab5f21d4546ac61e0b96ad5bc47586bd42edd8caf964cd2b997e0bd816ffd593d5481a8ab543384f8090d7cc0d9d4dba9001992366bbd61949f2b33bb6633f45554e879ec6399f11a13be5d195c927f9e4fb503c2f7f1af69725add00166a3c6f0b72230416d09687ac6109eb06d16b8321ab293cc112cccae7bd8233a6206b814694eb0057b708a76f7c793115dbd09b6b6808cddd0dccbc2a20c5abd02a91f0846ac0856a5cf7be1319057e48631937a3bfff2d24f0fecb55e929c1c7d8dfddf2fb892926e20c9fe4a84bc1d9dfd203d438a7f989ba23836bd55b1089bcaadbbbf19e8cf001f75059a1dc3daace5ef08b0b55231f3b63ccbcb50805601c86e10e48f90dbae123b55d421df8301a9c67f4cdead045d1ace302b93f9337ada9ed3ea36369cf35577e868383d69cd425ece04e0cdc1940b296c35e1314d837d6fa900d661eed125ada136ae005179a03494e23a245d96e60cbd7a04f9503c227e835e58935e28bdba5446128f0db08dcd9b85049c5c67e357a3a511f37a71df23c25f971df40b9982b1b5ab845bd4870fbcdf4ea319afa2e225dcbe3b4b06b73429467ab402aeb48e3b661a0355cdeefdb754d43b66d1b576a1ec93994587b16fef1d493d53263ba10fae3dd01736b479e33dcf87dd9af58b353bc55b8a5382aff065773ca8e932d8e55a80537dc04193176a1c38082e3d4fbc38ffbac68bfcbd80ea1682b79961ca070d3f7938571303267b2be5afc70f196383a01fabd8952db19f7c5921fd66ef6f44523adb1bb09ed0cd03c14b8fa91b088ecc5152d6e288f2f388b5870733b489081581fcdc2e1483d3a2dd9b1bfabe1732b2ae37041d49727a2bde007820f328cc2118b610793e6a6996e1f336a061eef6b61120049fd0b9f0847409cb3a8ab404c563c1769de2660b073dcb30bb916f3679b5819958ce2f5330634e2361cff5c0915861ec791b0dedf34a845103f7e1041a366e6109b88bcdfea2e0d0d260f16717d67e20c9a0b624f15f1f05339a408dbc7fa3b8395895bf50691bbeaccbfe69bc22e136a37fb9d074d668eaaa2f98af8ee35119d46af0dd9939462cfd2ddeb85792ca7d38d61e2c5109d2c91fc8232503900396ae6a85b7a88c80136699e77c0d7408eb88538cc544a3db250e2bcccbfa8076d70b026d46cefa250c128f8ab95d1ed9f028d56b01489d81da013201747b80513f318b84fca9dd1c4d65f36a82d09d847d550e1854341338456714e0a93424e6146e34994f84cc6bee325ae41d716920dcc0bfec62368546c901a8d43bf94c9bd2cb56283888ca54b758135fbff776c9fa98d50271b172889414b7e948180c03700d2cf3ebf390f0f9c8985900a76be9171f7439c60e18a0db5a46983722ff1489f77d24f2112b9035e65cfd10fe4c560426e464b6759ae5f24116d16f9a3167eadd85389114535f44f8054d463c1b8bab08779d40b74ee854aa6d652aaf40c30d63622eda14aacdbc002c0891abcc764b676a3b049deaf49d6789c7f9cb12bb6f0d1619548bc12b6df69c98a4af5b085c76966b116d6a2cffe4a00733efe59a473985d5602319fab0f04dc3a55be53e9c87726d6ace09dd8343e3e111858a3ae45b35de08b1730fc628265f0afcd3924b9c143450128aaf68f41fd5bd4aedfaa9411bd33032a81405dc45005c62b682112ce0952e1926a47571a8790d639580797e33f991aa9c0b7178448591f044dc794e31acd413e6ec84b3ec0ac0df66e08e9a89727f91620f3f18f9238ada2abf4557d72553f01bebdf62bdf5742d25b47def93114918c643aa2bf8761441ba5e6699760f9370b5c29545606f6003e4c6e4725dbe4078b416022b20c1d2aa30d0dcbb724783777fcae6d2487bb793e9435218f93573064f47408d08a9c39bc44caa91c24177e8283e59cb9be2c46c5329b150478beed8c6e1e35bf56c3becbcadaef963bbc70128a1518c635420921fb37e2252910e270692e8bd641832740d67f2174ff3171ac73c23512bb0682a305899af28fce475f399ffcb310dd96cd469fbbb7629fbceccfc497fc2e469a14943fbd5c4d24c8c89b66f6638daa38cbf9dcb49dcf016d768acdf758356834503afa00b7f5c8116e147c5397c2aa8ec8a241bb2a5dcfd45627821a79dee1ad9b162796b53c59e3938c94a2a531b737b7d108b9f1f42a2164027e7d3922858aa7931dc0f7e0ec8e0fc30c27d4722a4d083115c916da5976680da42e3a7fdbcb8084abde4d1f95f62a2291847c4358cfe83b13b9ec2f1378f75f787b2b573a027b24e9eb8a47188be809666df8772e43672f910eeb1c23355987358a1bf34c3a88c2647a46eb85c1429e2e5123acfce3504e0ccf4b89e9b3de548e2bc16b8e765bb53568070a17b23aee93b0988b67e10dca6129f19083a22e950a6beaffbf958a232d2b40a7966f96d8d6c1d30d4e9d42ee28dbcf0bfde533a8b5c07c32c90c634bbb90471c53658d596fd066db06cf96e76f5563b2dbf17c284fb88a7e389b9340cb17c0707caee7791234d4b9cdc0406a59ad5aa3ebe06c7ac21851139171b188bbe7b43422e3847e30014dc2f4966126c2d23e1d54d0db34fb2f415347f14ccdb4f533d2f4ccfeae45f21b027cda966933daa5732464d7e125f32b05447fe1d15170654b53a5fc3ee1d2d8427096d1f71f2bfa3e240740c879ab752f0b14d1d17fd880f05d65ff64a05bc08f69d97fb63dd78346b9ca038d79764cabd013d57fb3506d4b0ccef1c92bbd704aaba9cb912e6034ec9ab77210531c9a1266c272ce3261dde19b9a574fe5a7a031416011100ef594396adaed9f884d18173f0fbf256e47d5c57a47864a3d592c2324c39bb6b9f8cd770e23e5884fbfc119eace855f4f21356a57f912c9e27fcd292534cf2ce0e0490aca08b4df6a3faa614239252279fd2c3df91e054129e1ba23fd9b7a90ed0cbc1f9f8790ebb11bec7b0b07a228054e1f8bb4241ab3a66bb6a224bafa455ebf835e5cc1b0f7701e2e64190091a577dd835afc77e72f3970721e1b6fd64ed65abe1b7376eb58e3273254b2da264df7a97286ac43f1c55f1b50710f54cf02da4023260084aa143dff539c5c7d5951767d0ca6b48d5ae8dcfd1727774ad1c5e7273c2aa5076c0a0fa3ff8f1bdd088fbfc17040808f3bbaa83a228b573694aa171d4fcdf13185e0a010788698eba537240a9ee729d7af975b4a8637901fa3aa401cee44a0940b4378ec67b101784d07fea844a50c542fe2a3e01bda791c2ba0ea9879bb298b7883e1b8ee13a88f9dd3b28813baed3f97c29bc8b9b2a0bdfd03df29f826498abe20f8bb7ef6be2930377c56430b7b0ffafa4193998c32fb12ab1ff63695a3201e227698fa8fcdb065c9c3a82d2f0b8a78ddc9afd5a1c5b135b019c22a46d8401559149293420d91aa98397741e9cf6bd30134bd8b5f3c5a1889e5cdb61aeb0f8a052417c5dcc3eda52fd90b2a8c2ade1a0cba31ccc88a78e1573f68ec6104fab6c417c631e90bb9ee10daba4cc047ce30b2eb735ec694521b7a87edf3e15fbacc941269090845894eacc56321d38ebd3bf3bdcffe80e3b21e4683736c81a61ced165e3a2fa10b969ddfa1f55d340612e7550144aa43868d2ce06491f2e5e089b1fb3880c17b6040343b795832e1638791ab2d12b1df0ae253aa1b3e9fe01bb06f7f306c7468bdb397cf4a9977caeb0a3c95adcceb5161f95c985b08d5d703bdd011d2d4a38f16795b54058fa2183ce076cff0762b3ebf56d8d8d0fafdd508449a2f5b0a8692eabfa509dcd0b38f09f4f99e56a0044c61c067a107857dac52e1a364ea053dcb290a7cc1c78420bf502fcd56c804c8729871aae4a4752eda8c1f78de3419afae90eccdc7572a00deb5e1a90d1b8676ac638f011b18cf42c99264d350b77a64a09c433a470f3a2ea988348f59abaa12a1384b0558890e955f1f385c05c740a0b44bb51e9cddd91bdc46c8804eca94cbf9e0fb0c18b770b70f81fe5c9c6554b3a781b22665de565d08fe0b3bf6a57943888d387c19c296827e60eb6b81685016bd1b1c8d95b29eb8c335fd76b208dbd5054b22e1fc0ab4743f7b95d623ca64c9f9afd5285978bc5635a54a70aa16e736372ed027e9518a4d0d0f9951996b210830e6d46ce43272dd0923483f986349321b2184555b6a6573bced5fc778d682085d1970f05cdbe85c936a4634c9821776b4ca2e8dbadf3715228a73c71aaa271ad02bdd76a00aca5bbd2036ef7bf949814e76561a22c2f2ebcc43c7f4af62f5a40e2df2ba612e77adaf6715e1c980aec44b1164ea20020dcb5d9fb7072052e733a0a5b69d175ba8cf48b780b371575e490571e05b3fbff92f1e0fb87abfb18f4f81c8838d5bb155942adcf8911fc3926a22d60bc9037d8eb026ea975c00937d79432be5e791ff1265b396443813020ad11f0e0ee66bcc4d68aca9ebc2b4b8aff28de824007d9d9d00a12ee894e55c565f957f5f0cff21e1219c0badbc99de37c17efaabbbdfa903ca892d5a99a7201813a2ca9cbf7b5d19d779c82af7a1be51cce30ff3820448d2e10b39154573358bb6376ce5413267f6de7d7cfcb8d4d9aeed7a0f6648834b1452c58f397ea28dba8cadd4ef29382d757b78649c6436aa3e38505e1543fad8d22a415f8c0b6afa7bf16cbe0aa85eb9042f0757c8f3ce4e0d432b2b0a328ab69529c5f8bf8da11b0b354858df07e4644aeda913eaec05fdc24b95f6f4307741897662f347ff5785bcb06c0aca0ea708cfee767f385962de34b05f897242256c1eaf5fd9382fa9f07c3b2acc2d0193cc7688fa71448b4374cc3805cec6e7b503a693be2438fb03037d7a70088dc9fe10ac37c84d29c8b5f04648bc23c998872af1df21a88cee43d52ab580248f6d11c0896d25c4ec8068afc138518f52a23c9c8ae8dfba103cc49368a2ba7a6111a8d0e154d007cecd32d9a71c3341ee238d7664d39a263ce2d5efefe4065c1654c4996e5eb10397d78ab6ad8155ab5c815707655d2a85a00187f8ed16ca19f0fbc8c116417420666e9edabb192cb81fc6e2a4fdf00bcbe0ab582a63de69af3d7e7c6ec7f23c09f02a81a221ca2d2edaa751bfd3949ecc3e81d6f518453b47911b0aa13ff53dd8a4af4b6d8f40cf4ed2f5c3e700749aa3211aab791b9e9e899b4e53f3cf1d1c62bbdc06ae2ac394be1a9694858919da321123184a8a07d01e084655b974e8ae6919709ffcc4826f62b6a5dd420b784eb881ae6e682b292d2e575a28eec33e21afe2fe17e024829ed46bb4babce2e65d97a656feae5f5bcd3f10312a5a102bac3e502a468c382349d47b6e7fc4435a8c56d61ca2c33d93ded9f2165c1f640cd23b0f36e64adfd4c5afcba0fe8cab87ba2040efc0c2f00d3fbab933303b1c34f15a60158e5ebf5c82ed18c84c54babe8e1e4910921d3cf829cad909acef813f174ea65802614fb567944b14630d1e4b063c49637e7110a2ca6de4f34935866b3ff0c3643014aba7f8ce5b2701abc1e0f9caa048e7d8fb937bff1c0319a1de8f126a16740d7f0a8833b60b56864f98ea428e2f105ceff6dd30a16bd24da9f75dea0f4ce864bd44bc52b73057527b73f35a7f9e7bfdde6435e68fdd781e82b69b22c09b139b35b5a47a385ecf05cbf2152cb5c686616f81585bafa01d067a5a086cee61113870dfa9bda1b2eb1975403b994e4669b30bd5354784b1c5126ea7313e3230fbab806e8cc7411149ac52029430ce0be92453dd7cb39026ef26451d2f230392670bdc181a0d0b24267d08861c5e5e0d00d85b84a0873c02f678f2522eb8bdb04c2624256e79396404f475be988e4ccdca00ff9c4aa86cc48ac5f05d2ff1ae536c5f576d719862d44049edeb7d25c2e78e328bff60bc1f09db639c10486d65a8da9638080ab92b3c9af7799a8149cc771857f3d36a495fd7e58236beccd8ecb68aa4fdd1f8b3fc21796e7327e0eb730e0cf78567e40a8c0842dc3a9f7451f347af2375ef47b560bf6f9cdc8e682ae9574b9d7c9cb4c764ee84a22303a35b49568d8dc89f74c0447b0f263ec71e4acc6de6e6116085b7edbb61ca4b198e2af4dba714c3fe6b9c821ca1880eb1b896b01d086e80a43ddc9619789c75ca44f8dc9d4013ed4d10c50976201e6f020d6993d42fc902b299000581b04d1db1a4c548a774fff638bccb298f45bd0a30ac11a107e6b9042c41634732855c7431610456d2d163129166cf90feb8df5a72ad9ca31a8613ca3df539f599996904716878028bd884b1a8d75fd0d3fcc6dd8e007f6f9761ba55a00fa6799b6a3ea67a6a55ff8843cfda811582ef1b553b27c05331aae09b5a46aab96566568153afaebb7b4ae5e71f7cfa6fe08aaa52aea18d1551068e25942f623c4b8e8a56f46e352cafe4885dcb1eb19c458580d2049ffd77af8380ff452acf5ab88fd52d7ef112c29ff6464e62465398fafd06ef81bd3fc2b4feecc6f45f0146c96d4a7c0f90e861a1d433c5deac14a019f50511d6ae9f363952c0ba815bbb3774c97c16038e82e39b76bd15f58f6c693a973d1cfcfdfd65ff61efd3d6ded93c3aef8a715097e97d24ddc94ba972fdd68c732e1a9001f3fcc1a71f1f9fcc1b98637899fdb949c281d858130712d5d5408f0208d62f5cd7f81dda2649edca15790c87cd4e24ba48a7ae328822f5a21e57f6fc5a6fcc71d532ca6817f6eea89f76b60e4fc7bd243c2d2163b46ec46ae4be40764f95d1a51efe6f6d8274b668c50cf1de75ca2b4791dbca7c9232d147d568cfeba0b44caf8154bd09fe8a55a8bf1bb1afa95226a827167b13f33b924ca637182b0bac8b56e03327986568016841bd25cfc769000a7c746b2d930d291ea94f371563b92535003c4bec0bea1b134915286a1665b643bd011015ef04ac9d5abd487c0c4d3c6b20a00646b476e518fc0b008960148a123365cb40be362b3b1694a8d5c05d23b018370f616496a52c2cd25021c3795baf897f812f62a5a5721ac8170e79b49cdf906bf71c83af3c445a82a9b0979506e7df0fff03405f717f51c69c995d11456b03cd8bf9395d33fbb127e4cf9d8fc8411a26d42617ff2d64e886ba9fe5c7d5b85b43fc4faf88e7b4eba7145234769d58d53a5c07d1468693b0f93bac6e2cf5a931b11506f556484824d227e448c0a3805f2217f136c1a7d56f3421588e286adec32d32422b95ce8fd81eda1c3e9beed20f03cbe487fdf2d65f59add2bce47cb5f225b2c6c09100225b4276d3cb5b6792be4b8f0489bb750f1188f371880930d79cca6b09b2e3f303f766081097bfbc5e538d3cd4ebf27befc9132225dd7428d444c764860a262e95221f0f1fe57f5ef3e4432d2be9b3c9954a88e58cb329ce9cd37f4fc8494ad1cef800a7bba8d2ce486f7ebd7a5bc9dc73458bda9e4c46c6297469cb8d4e3877ea8db014c04ebd313c6b1ab74abb69b03334d562422a6529b8e68f4262dd3ff05acf1c6d0074d35e4e977c665a26f86d6bae2c4d64114ecfb334c4d575adab7905729ecc6345e3726d7f2c361ab9d75de26315cfeeafcba9bff88c0ce812554b1c6ab0c5765c5618f1bd8dcde547b86af905406ea216e4eb454e59a835fd9648dc5c8c9da88d7a753a2516b50d93e7226868bd0c4c6c2eafa7a0696a8ac2f0f3e6958efc1e6504032b42962ba6eb3c5bf856cbc6bb090d481489c42a8e6d5721b6cc02b34d6650157752126de0cac4c31b7b073e2d6d546476682be55d764f5bb3154d70dfa9244a6fe5580db958e4a766f95a61987102d67707838b177d10d116ad56368c48e815b30fef5fd6554acfc0d9e64d3c4f6b8e9b8ef6af2e09c6126a92f0865045cf97c94070d2fa013be48df5e50bbadd9062fb6183b147f7dede8b571826f81d546abddf5de4f95a97bb75200ef5dec4abef4950b587763db4fcd61017a457c00230cb8aec3bd775980ba70362b6e8d064f81062eabc6149c115feca46efab3b703e76a9241c72f6b6810adda98e1baf07d6a7d8189f6ec869b54941c40080a91980fb827c61c1f7399539387fbec2d1d46a54b1f518859b3a385ca098b86039bba25d2e49b7968281e3e1c3e5c48f2012680d81ccedf131a8c8891b4134bdcfc70854fc7787d03671c9e55185793ff6926ae12f1dfe8cf246fcd33d88d159842e8dfc7c257836c98752b7152039eecefadd80ff76e816146635ed2d36fbcce101eee7daf1515676b9a2b203e1cfc8859d128852e25f9cf924c16d4a47272e495645a6dfde91cfeb39f4e6a1613a901e2bab7c975c885f6424b617475aceb396d0d3da14c102a69987f66f38599c60210dcebeddd8bbc80aefadb225df56b7f48d1ab0a8c92584a41b9fa726a7de8620cd32472c1b89ee1cd0e3da8b595f98672343417f766bd8d9c52f3cc1a9bd6e1c8c1e588c023ac6e5355e68aec6bcc303577faa7bff293265f9506c6107432145deedef7b254d5890c755a39f5b3aee4364373a931e98d5ec011d247fa9ef17a68b2df72810929a628f6ae634f4427c1538dd02e1c9962f33273cb6add06c81d6258de794f09700a9c8b2b6c3a30eeb00ece206d70dca75beff10e9619d80bf0a7d93f24cc82b33640aa992945eac34fff30584801e2ca0fde10854ec1c60cc5c4bf08753009063e7efe7e07a94cce2de1d2add68f2abf5e6fedeb161beb5cbac9ad02c043d3d157acf018751e1140776a7f32d71f34c05cbcdc9c08a7c7a03f596dd7164540566fc54fc1fdc2b23b14f002eff9066b55e30040ff5ac54b8fb6d9d643f939aca40e5005f1d5972feafcaa34f2a72d6ee03ed74fa5e70faa11ad4e8ad2d0f788900aba49c29090a73b3432d9ab5d933c115abe4718cc9e2a2d770e9cdc735ad5991455ee0496b0ef2465e39267af0e36c30da7f3ace53cf3f6010679001e39f6e2a55da65870e9793b447b418ea1e519dca3c2bf0e1d0b0b07ad96a0708f428173694f70a113c0a0f79b3251914d7f8af58d59d6e198bdd6155cc3a4468be06e0af9a1c94c488c9fc6b44e759e43695c0873c1415fbf56c065a3ed585a790bf38784ff3cd7baf3f4b22533d735684bbde582438d213bae7dffaf897289cd0052d6788718be4e3b7c071d3c6c7b75f6e0ff3437e48217e179e35db0f088e80c8aea5749c71fec4985d00647877c9db4a55b51f07198c232adae969c821be6ee6c2b1ebdadb00a8916b1f93b1724775ba9efb421df723d54cf22caeeaa1b6cc7567a4279647a6e099cfe285cb30cea5a1019f43cca22765a15759f20dd681057a0832833c15c54cb1e3f0196aff51abc2b0ccdf37edab8b536c2a4bb072293224e9d4e83ed427b8ab2b92f52a3fa6bc28269618922a022f67f778779bbd3d164aed6747c9639f1628a6643f47dee03112facf7431bfa1954ab2d58c7b02ee380b86bec76fb52093fa5419c17f20b123ef0b0b5c0efded93f18e2c0aef25c1665c3f91a3f7faf4dae9cbd84efd9ec0a5ac4521051118c1e28dc3282be83918c9b23e06363782ad6d6e99f69a016153f70845309cb9d8e85d0ef65aabb02b0648665ae39d5ca7ae9c4de2cb940ad8e9b5e0e59ebf2298c6e16fe35886fbbeecc719f000d9c9764f3f90f66c8f9a243bb25bf84ff7cafb76be8418da346319798866bda42213d5acf00d836b2a0487b7fef2fed4cddf10633bc7f2fc2c0e7e7c8785b9bc1eee0d2d5ba42fafd5360f9c84c1a9fcf8a76ad2916c31d66257c39a760621cd0ae7b4189e051036acd5aaded0acf934fef24fe71a14cadf03afd4b7c1752e0c2890930d3f74b2674bd6135555911face869062ba346fb8bfc45d09f224e69273d4d00d5451ba213c798811eac1b8fdbe4631313aa8e35ab728a1bb9db3c806c46db222980828ecc596b8a081368d73f184401ade2b7f6debae497ef70b13d2aba139f22f233b4299ebec79ec32f868786c60171f0633ba142938699a702eb57a26d9d6b2e955a90f1020e798b3903e9d9dd8f8c98888081174469697170c38d5737a58c8258c8a9361d270357e51b67011ebd39578f6963f18bd050d014b592dc375e006cd02405623bb724b1dade6b3cc632db58ea103ca4a3d939dee5df3307dcbbb3e3d0079fe70c6acfa53430f31075b1ce444454ab8208bc4dd2b71d3d8dec8bc4d49797d2bb3f6b35338e9f1100b6c079f327a639e33cc262fad9b18fb3746829af4c08ad4a84baf08f6cd31070997c6d4b78fce290807a05914db726d20735e0e7058f73856aba4dc8642c0fd52314e856f32e5d0dc7edb7fcf7c5d04e2fea3af94ebff28fa8e886d756049f0e8a4c2d22c94866366ab8b0350e1bab7094ed1337ce3002463e49fc894ccbfd05f133ab0500da55ee616f23b36a748c528ee8e2b792eaf869e606de86d3eb0a7822b7bcef21c010695c05adf371a88b0b36981910ce1317560bf020004077dba0bb55f26249beaa36e7da60d783cf89345b38e3c1b5928b9dcb5a677ec98cd4acdcf960d3ffd40e86c6fa43ffc198c2bb1ba99fc5fed92714591730fbc7a64ab5ef06e18b5f18bd37fa9c3d954239d6dcbba27c3081eb7944d53428bdfa189a83db26d864dfb4bd729a2ea41ec866b8814d8a0664f0dbfaad60dd54ec7c61358ebc416a6bf798fc65c408e48c785e9a0746548fa593858cdd067ae1e0b5a35e49a338dffb1aaba512f5fda377b8f3f4aa6c76f2d33a6d4fa73169a9a2cddbe44b49075efccb37acd99774e63769ae150647f354f0b4b93ff3028c66de35f1d715146cf5d5c1a854b45bb38a5fa45aa211f988b4c9daf94f61ceafbd989d168439c63b388672d2b0bf170b037e5c38e89df56f80d7c6645d7c045f4118fc79b7c667e0072500d627eac7bd3a17614934e238c2f575f4a978fd53246da9d3df02a28b9291cc09a71361b010d1605e86f4f58298cec9be2f7e17aedcecd5d87d7302b2290f1313eff056b100ff9890dd989f495182e2532c691d96aa97dbb2ce6481a0f76b4e26fcd97a02996c39347f90aadad5c4a65e62f9ba6f37fea8df342d5c6cdda448bbe7dfc4a461fa8cbe1c2dc0a78abcaa67129b998e6f9a913a6e7c84e36b936f4db32f000d06bcfe8ae2d5fac04cf45bf3fd3f117bb0b3da685e109a82f200a1e0d7f8522332e5524a3fbc6e864a86f9fbe30558b3263847d890afc1b64e835e1526ebf69d743a13717163fad0f9e058816a176051dac15dd0b7e2f0ece4d367abdb72a339898575595bad4acc3b46b597db68a5b6141f850d243fbe0b3cc113bf7eb27fe4359ddfc4ff3ef16bc7acaa0f3524f310679c03333d3fcaaf2e7507ba98f8dd1b770f36e426250b1ff8a9d4bc25c463ba8a7630a582aea3252e0ec28d656063d6177f74b1c88d457bf9059895e570cecdd6fa724d2015eca9c76ddae2798f82a181582723d0bd2fe875792e22bbd67b111812ef40703d6186261d6be2747c72746960fab45840f4ff6907949f20902b065fdee98d2c13ba04152bbc70eb415b14e172b028771339fb0ca708bf580bd2fb6a6d6efc0990ba5d213fa95f2efdd8b1c1b699841b8e154451c5de23871b54be129af8e3043ec5780cc395f325d33c4d932a30171ad6c362281b895db4b604d1d097b8f4162bca2f6da265e7a2d1130043a9d21c95effcca1ef06d47c6bbb7860392e5b77d17706b5accad18e8bd19ee8ab2e950a5d8f6789119a4dcb02ce64ad5fd29879e948be85c8c35669a06b2fef4fc27ad44a3a5cffff063f9268ba3b8c54a777bb750eac7e3f3ee767a4eeacb1b7019d3eac82fe5f943bd042063df081da663ad14e7f4661e550e495f413002a6d3eab63e159baaeb60fb7766baabab0d22b82221bc37ed6ca672ad60102c15d040e6085a1f4fe67bcf63da0a15205892a04dad9b3ea918adf24d6479fd16e935badebd0aeae1cb6d505ffc29abfff2708db39d1ff6420288b3b779d291e3ac4b944512eca4f63f4e1069281a089d91d3363d15975ffdd1b103e4e2c163bbeb915a5d08454857a9d29d24b72a7e7df6e3a7e90ed517abc95a448aa0179959285247f17cc8d0532fb13738a6a21738ebec71e2e68c55d8a8b77d456b385408650e627970ef13765744f4a72e4990912186a403f71bf2a9b8ac7211a0499266466c65de65157d36302cde084d348ba46da3efc430677bb5b34f75f39f16bc710dbe9c4a4869cc6e820ffc59239b1049720bc24f5e59395f0f0f153bdbf207df37311e0d85db2906f70645c876c000583812026239a535cc06a4a6c2201b19560bf574825662aaea2dfcfb3551752e89459e4082e9196dfbe1251fdb94b9f997689be8e8609d4d78fade40844bbad5caff8a07376bd83a13141c14d0ce0eb0a9b2e621cd7e031660970aa4be5f7dcb5d15c2bd2ede463c6fb2bb6bc1abcfcd7a1af96f1ae98ae81d315af3713d000ab889760c12443ac5fa79a48fafb39bef31b3c3b9c636927e868259e64ee02f2f9a5ba0b9f1c4b2a9e7cb48beb319433419798210d720f6879e4cefe84130bcaf22c1e270f3e7262a578ced12348bfacc7ee33573d2916ea63ae14659f467dd8e5f72115537fecc1406e977438fa47375d11d5327cf409aa1ec22b0d4905084e18135917ce073aa8bdbf4d9057bb2e7ae21cd46342745b6c1a43631a5a25baf33e59e461339e402f29d787463c8d5ac2a889e7d740b7baaa588024c683aef08e721ae1f880966e35e8288b4724d97f6feaa0d812a9e876d10c7c8c222742ed14764b183b66100f3644c98ee165abe1f36a2395279ac1cba57258cc5a26aa5520a16d77f075214e439b6eecf9791cf735066b66cf71442b377775018c9ab44312fb5a40c4833d198a2cfede24b5f8bf7e4231c62c5f33669a2ae631b3a116af83acc02b72e05819f01a5e1f0492b5b11ee1f3a73d8bd473bef885cf88b2e8e35189bbc8ae8c261521a0000cd0bebee7295e8d35df1cd49f078e68993fd10373a53eba652a3f4be4016b27961e93935a059a321c20970e694c4678813216632a684de2ba44885592672cf46e54c9ff27d01b29676ec1c058628ac1e7cb063885c6f6e428195a37698c7f1941c3066480ef3d4c8e1b601b6b65c61b21c10bb3d84d09f7e1eeb38b7c94d1fc658c57106b39cfcad009e4e4b93c6d969b0b7ee231234cc1383e71623de0c1930db8a8dbf266df0e2d924da51d9f49e836b82d2ce0bb30f50bffad57cb960f448965a23a6057140f7da0b5e29caa6f95025027be799a52fcc906cfd6f55cc96e712e11ba2bdfefd3ef150f1f04f6d8de5d7f5f9f9262ffd4c0509078cfeffc27d9bacdcbd99cfea305c080c296d6699654e909a3f8b05ec63ed6bf1c01f9b1b1ebcd5c3d34f8d5e8a5d3386626297e31f510a7dbf67751afc4f77effede7186e0ac5a05c4cc7bbaa0ca610433f49bc9518f1ab48049c1dc8e7ab9ac646e024225326431294d5335d627c3a6e9e8a06d8fbda1720dfd868c071682118c570782845edb082de727983c8e4be4aa9196046dd5a92f7e3e9a3d993613c76af2ed052681ad82d8446aecfbd169b3a659d27f0b012c45b9fd2d5b022492fb34176720daa6af6b61d245cdd44a017fcb0d82b4bc34d8c14d8c815b75616a4b8a0825658e903767625b4514c8ecb6bca7e3cf28d065a4b18456ee149ee611f6a6ed9fc8060a06b0f0a6e3de41e7d4628e915808b939e901cd0e48c11deb612f94b1eb4d589df95e2b19077aaff56d57afa46add91f6274ca2117fdf4ec9ad15f2ce0eddcadaddeb39117da645bc127188f7596ca6c7ec46914c17968e3c2c976a4d71f7f8e853a558d6f09cd504e0475641389dc5811d424893cbc25778b3f9ffe28d83db243f69d7fde1fc646d6726b7ed9ba058a2a69b0a368da3d7da417d71552e231c3334b7b37884f84d831e2952e80b10b205eb9b5c02697e110e3cbaecf4e5af641335a6f8c4d00e8d2862717d2164e4ef64ca969d66b23cdf3bf06f801fef9553859094bbc872153589e8153a49c233294fdffd46656c1304642139fecd39fbb08abd4b8730169b9615d4809910dbf0a2ccb1fa8d0c38c950265c77fc4904f97c11c5e59b9f92bc653e67bbb8ec57e1cb7111dbba62ee56eaf48210af4f5f238490a4aec16c6c60fb4d968915a5a6fb7e6767111a6dca6e279498aa016965c58939dc65f55863d7c21b6885c6c360b46772571acdd7b3eebfbeea2a681e8e10e4ea4d95e259a48bb53059650c9914c768f1b9cdc3998558b5c3fb2bb4a643c85cf4ac4582d554fa71a40235700747589a8f837ee85a9c66d18bb3d010bd28f47505c45bf7d61822152e6acd38b3103115e3f4f4839d9ed1fdc3a9abbdb8885274ebeef30278964b4833509fe21a75875b7a1e59aa1f293c9ebb12e2f8f2f112f99fa17c5eb3e7f4991416e2829f7fe1f851fc3fabfbb6c03ca56f72f11e5a21da6d3a6d9696e7de32137173b91c2f6891fe71089510ce634749312f9ac7124ad7b6757e4ff3d7594057e65742c447d56a91e718ce52eba5bd2d70c9fc35c463a9dc1c8591d8dd2092a7f6686bd784de00568fc57ace7ad9ae6805c37e8b751349b9b3ef1bc5cb2cd17d7a11f3ff522151311ed21e0b9c9c5ad9f1e4787e9cca1732f1666fc70b51e9764e66d1b9d30a1d88d75524d3fb53e5fb3a618b50200ed743ee6b165b147726120793dad8ab8b10e937e32de51ec7e3f2a3dbe047895ea4a6ae75739ec0e004cd0ee5fddea612d85a1ab88d7d2736c6e5272a40a3e47d013763d5a9b196a4c494ebb2ad4c6f72dee216b533bff8a61fb1a5dc95f39b4206ea2530a7844e77df2500fdbe7ef344d09898b7f3c5d8c79e3f9e9e99981c3df0e3dd7505696fde18c154f7e02d9bcfd47521d7381c93ba2cf41d78f561a3f53eccd577758e03fdf162e38e6b7ad8394b396bfd6aafce275591df4e8032d64784b7a731c408694c16a338d771eae93499d4051f8c668712f2c64fdd596bbb9a10a35766928428914a38b8a557856e13f97eda358b4489ff9ca5d523841f17f746948d5aee5698785e51492d8b8f6b6ec652b0c876ceffa2ed67efa633f66e21a5f435caa7a7dcea449d8e8a9bfbbbf8357cf2380a303ef8660522910a645ea39fe978baa4a3fcc588d283046b5267851f872aba05703ad893f89188b0714dbc4866be93dfb1d0d04e374ed83abfa660da4c6c609a3274e432b71475270e532f06da1210163895ef1d4a256adc7f300262158de51086124508d017712fc2eb1e2fd2d92222ad09b2f53009ab06d9bf5f3e71e7383297e63ca640e44389dbb99cf0f4845f71bcbd058bee28d4db1d80a328aba88bdd9a80b726bc51e53a92960a985e7b86ea2a8e88e6e3641180eee8cba7303d54eb60aa3860a0505a143ded66dc49565e0a80c0b31fb85f4966a2154c9d64eabf2dc8ef2a2014cee92a3ba64c27b3bffa528c9bf353195dca0e95329d8dc1d50b8d5f6cba99dfacd70180ba326bafc24a472a65a5929d7928b11443974187af4baf36da0e89ce5f08c5bd698fbfe81810bfd7762c0f5d975fe9c778e4f1166a5e3d8fe0de5a195e128bee49302ad6e1788ad555b9ad8ca4892d11df7867bb6edadc878894a0e199fb4bc05a34e04be99f27af0916cd68dd2fed1b2e9582cc30b8048e2f848d49d2955fd5ba97f0daef913749324112ce2864ba84998510a5281c1df35afedd4f98e3eb6c7b0c0a98b3477bc07e074614cc4d85fae7a151dab1a2ed42c43a38659b2fe859ddba5da7d4f2a8f63442bca4dd3e11b4b981071d764b8e02feed5b956eda0b872885ac801b678a54ee120e31429866ac759f6f373a0f1b95a3f1b42c1087371758e01278a69eff2eb0a2f1221629d020c7754b0ab0de3a0d6a0d2cb1e90f23fe08faff863bac1c837bf6696b734d066596022331c3d1cb3c3bb9be964e396a1e856553b6d968b73066aed50439d8e9a64a332d02a891c1d6e29a81e0bba8ef5a9f86683d83d72391b67b62d1780c77b6457a265da0b3599e0b7918e49208cb5cda359676c8d96191547ffa8cc717cc7b6a6f449349e1cc4beccfe7613f0d3b715e4882a69ef9173ac2c261cb62291602d61bf53ad9652186dbde45ffb908d1316e4ed3c1d0b21e95ea66745ca0f5d480f690d2c519b595ce82e967644cf7b72c9cdf158da5a7e8443a6c7b60c129f2063cfa9b9f8989065880eec8dacf623e93db8e99c09cd5d94df9ef277ea6471ac2911a3c86a92831fbcd52e3b3af31ff8445f043bc48bedb11069ca2b250ea31fdd4228cf2f7735b6012dd9027594afd09f0b5a38c1675fa7f6035d3b5669fc3375cdf438e635b62e7b4ddd003c8e366671bc8e9ef38d448a48e52feb48510daab05d38fa18c7d8c0b3a5e8420f933737a145de6130c74925bdcb3e305a07202f91385af1dc4808d026d33e6dc360391b8358dde02b04e6935c783280eb340fdfd4d015d2e525dd18cda917730df9d19b7eb51ec0f53b3aecdf46ee9f68fbfe0c71896553fc8e85115080ce5ae3937d69820757d54b4ea04476815a5321ecfa8667b5ad5059a4b5c9e4e0968a38900c7faf1d52b895c8420f1ec7fb4839fef81dc2825e602ce89f3c06902b61fc0aeba09483dadc596819019c54d2d1c52ef98bd2f7e6c3053daa2cc69529515d9cec00aa1a6aad3c4f093857fa82cfd78bb540772400277753a1196bd4005a91a3650f65460b3a9a36d6c53551053b95e24d1ec4d078cdce647198ca0463cd7cc0501369399fca08aa9df985e11bcafeb40899d419a851af6398eb3c15ce33a3d90055706c1da634e3120aa28de3eebb9bcb14e7dc2e11834b12347dc58b2292aa14513bb993b78f8121cfbd1778e1ee331461a556887a63c6a67d3265080f3bbf156f186a26bb800c35ac68c0a472eab420aa380146dc9076bc00c65e75e4dba58475e8b2c77b74f292db225fde4f6d2a959f162855519f07b77677a56c7e0e91c7154c9d20e400eca9e868e8cdc17027ee04164bd29678d7b8e6319730f060ca1b246489803918f62f9b7d759add3f3f4dad0a6ef1de4f4077945db34a570cdec7f7958103e0f73ff1ee8c466ea692d1dfaedf7e7a7e94484e1ca6204d044f468f4527844f765cf4eab0a33a680d770ad3507002e35ac84f6687ca59e4fcc3bb51955b2d4d98068d5d44a46ed5ef40704d3fb7d10154f4aebeb5d6a305de2cb6b2711c5770bf878f39f35779620b1d695c2904da2f6a595852630497caae4cc9a822c4751b51cb69d635e6ec47d6972a29c59515e2eaee01a5589c03bc24916b76c32ed9b78950e910211e331b033c052413e24ae325af29db647dd02ca06cc5224a8ddd55f26ac43a83d96e0beae9d7b9ffa31d515340cce114c66a177f8d7c291bdd49c1490e880d8f82ce4ea6f7651404d81367362f2a3e9b0ce311eaa8fb8525cf8690a8f943ce49bef0aa03caa44fcb439b8b7a31a72fbb61208a04697ca3bbf8b5a0606341a0e784d6cb82b093b274ebb4cede80485b612e321be1166e3c84f2bb1789b343863ebaf12ca70a92ac55a78c7998764400fcc9812fc3e8737af721a4d5cc5264f3a291f25e2b52abe5e07a38ed0932614e87fc1bee6b2a8b66b83fbaacf3f1b49270f8c78c5468ed6a7e4d2571d60cb9808c8df22161e553f1fc3361b0d4227e26d087c80693ae4c4477afa54cc53c3b15e1b3f4e137f9366aa52ae0ba3e5f2d50c84d243d55326218faf8ffc2d6e5202bd20e4823f1b4574181a7470dfd658471b2655b40395dc6359ae87a53f19edb007b977cff3c4b0dd1b2b23d4f4b5103cba48612cc2a8d1dcd208f85c903caeba0e6d3a7348a6129c86843df4bd2b5a50699955e9c1d6c6200dc5bb2d90df887813da1b9acc7678755e24da71ba4f60720b57ac93e7f8ca9e4c9c0be6a608008e5f5ebcb631542c9c2f6c408279633b43dd688ccb4679ea0e0d60267f194210ac7d7ff258f76525bb51e2ef7d72bb10161a72083e7de7ec3ce96f53ba4f83eed496525ee2ec23ba0e06713cb094637f2863d945432ccd307ef45e62b25266282b5227cbe0c9b27e2eb55c7c15510ecd3145c01ba5dfa6b57ba234d1548cd65e851953e0fe25805acbe0be413d12526dbf031d07f8e1177d3377a2575fee0dbf74eb62d01187af05ab977b1014a5f52a5a6f20de227f3a537eff328edc4a170dde3649d6778aae839e1e24793b44b4251518f4f39a2d87add841b3eadfca7f57d968e27587bcdf516b425e59866f31c19c2ff71c575fe262536499d92873266e559d4bd873147a449dfc72d80770e045c2d02bc3cf98270d5b66031cc3a8020e688c629886cd664a2e9e01491262a51d5472440257dff2e991101178abdfa061850683747fba1575df27f75a96a4d8aa64da924bb79ebe2e1e23ecefb00e88157f648c9ae937a5cba7d26dba81f9fcef54a4d550b6977656fd6be5226f77799b1b731f7f6f9ead317bb6a370075e4b5314829a0bcb4f67f35435df3a8303081a1d427409b01ba7b9824af827759643cc07c9ab6c20fdf9b94a54a3183d21b6f475f7b7cd8a515c1cef21b386368a39d855a92eabbf9e691ff24556ecaa9e551a8c415d89a0305c15cd8fa9838fca767318f14de9197e878c573bcc853a83107909311d62804fe87c3bfb056cfd43df4c09ea3a0d21f933bf722bfc924d1430ba51efba89d0c5e9450eb71f9e016ef8833d0a06e59829e66398b1114d39479f03d506394ca034388889b5333f1d0bc9fd8f09b7ec5cb4589aab56d96b2a2d16aaeb74d81a011ad5e54bb686c1a8df3a1447c7dc256cb670644010f68c1433c187b32920b9311ed70434f597258ee69a55ee5434c4c80623288f8cc9889498a5fc6653f4b823d6c3e6efe83d1bf4950ec13f9ffed06013b0721962ea59b8ca86cc06f05cdbdd0d2305d93abac05726b527177683bc28b149ffe1fafa89c009dcc0caf55e1d9bfcd1c4fe397d3c5fc0c6da383f4c41daa66263a471ffa9d981e47f85ed33653fdadce24b56b94fb30e567fc6184e01a8905a7aeb5925859118a1060295d50487ba0c1e76ca8f99e22f99a39b809b6505842261b0d4deaf7d83d2fb26bd39d2038bd1353a36ac970cadfdb87056420c78d63ea2b2a7b8289306c163ad35031750bb6adfaedbe1a7d51f5158cc4b04321c13926f56809b0335b6d88b5f779906cd0fcd5b7c0f0bf6d57490865b51ac8c9710997aa076ad1c40cc145e65c02d25485362c3f949763200c123e7cf1bd09cf556070bc874f0ab53e6988f439980de48974db3aa17f6137067fc13aaa24297473b2302d7b44265f473fe4455ee2f9d773feb52ca364a20df1ed7c6c78be155870a586e2132871ea4fad2b4add1d2c7040b46554c5b8586744dfde9612a76439e16bcaab8daf5cc20d89f880251a9fe6208c314095da7ac5ce369c57a576361cb1f66fe1da7513f997fd3c6e77b6d166592a749034ea50feefdc2f7a1bd4e6ec60fecdad23fcfcb829fcc8eaff523797d9dccc24145816b74161f3f6c47ab2b8632b0dbfaf01938edb025a9c9dbbe795dc542c24bd7135c7c5bf361c1c3bbf4a50497c9ef18ebab83833e4452a3df9657850d114a9d102ab023ae9cdb3db837d1b321a9bd69d9a278b97d1e086a2401c1ff69f5b228bf2b6cc7fd1e4aa6433c0bbd64a74a42591dc0ddf278cc12313d7d1b81c316018206e1f349b4ee5e3ad47562795c9478d29946e442c4494b6b6ae6415258f179cf340a9f99f9d16fab1a9f05726e37897d034d3f9b469daf9fe93e4c3994196a07c5f9128f04a17a8261a6e527629565c2890eb803722ec91e30c06ff14f407809e92f184c45440b20cac6f6be27fa691d140e8e584b623ba07dcd1ce6103c844f125671c253961ac00310fe5f4ab96bb88e7d7d7e1ecf63b5af80088110724d6a5ae7a4f6970cb920b3c055d82daf8e0b1ac53aa6679f5ac85959ab6264dcd6528d5a3f1a7c7fb9fc0e2ae9ed1e10a3331a450d6887fc51b0861b5f461369ae74099b381185fe076e2ea69b9eb54a699c9268fce1b3a07daf6b5dfcc4c02975307c9e725c3047e0fd1bca91f3133a5a14ba5cb001ed0523a95984b1a5c1a57bae0f3f556cf9c0ce59c2c4f892d0502ed46471a6745a5228adc2edf9f892b906b5c0e4e033feea3215e2b140993432d4c96c91e566cdea64a5a43648440d6cdce43c803ac6c3532d860473abb463d0737e6634aa9b20c78e73c3bbabb6cef59c8dd38fef882ca0c68866737731ac94fed1f8ffac930777301a35eed5c538ba913a1c63532c5fb6188b5c16ed280267439dca48f966c2a43b4ffc61261a17aee54da1afa7b5d2a92245beadff99989eb90a7c1acd3c6a066446987f64cbd6363bf750761e4d7c6c67f15118f782c7b9dff23b61bc124650ca02f0c8390dbe4ed73f994e1e5b45644838c0c6064624dc7761d3254dca99938bf376bb979921dfc19864a0fa2dbee6eb33800c50e4867e4ad14604e053b9a6339d5aabc5fdfcd160626a11e805572666d182eba3d983ae48df106572c7dec35eff7078d9ccd7e507c1e9a6ca2407231a0783bf13d201c4ddae4f9b77b4fb855f743aee3de013ba45d8a6420a476e52d38afb23c75f2f1bffc4f2ce861daa4ec733a757be06c5c63d086081020ded0e38a7ca7ffd27ba5cb21bc403666f301572e1763b2e60a7c0847244f540786740d26f0d1021a2b81ef853b2f07109f7094d4ae75f4e84cf1bd63ab94cb6a42c38b9825572036ab6961fc49dbb24094b2de3f3365613a04e557359ead16d4ab1e73be6dd71f37e88123c8b94c25c8b2bdeb89c517e413d9d09c6cba7aa3e573a1f5621948761455c665b713877db28d7c062ad721bca8b7b28ecc060b8ed68b461e9db67d4808e9e2446ff7a9f2e59161e6a0fc484afacee5843ceb45e6fcae60af3ddb9749f003d9889039039fcebab673512ecd739ff5b610a9a90029213e112cab2d83a709e19c7ab3ec16bb60b0a53f654f55ad2b734df700a100e5f2ccb0cca15802cffdfcc8076c8f22dbf9a8d42bc6e00b4548acc9bfff67c5d812ba4b35991d6c58fcdd60cd3f708e06ba59abe93bd44831cd6e403fe2d71b54ac7d813cfb4eb047bf799bc95f460fce9549b7a9a489f4ad105795689cfcdc9225ebe59299f6989b58a3e0065a9f646d82aa27fd954f015889562bdd4f897fe642be846cf3afbe2acd4e2e40e842ef4a44956b251a8bad504676ebbe99851701584f2f4f69aade1ffc639cfe3243729c938c15f26f8c8571b5ae94b02cd95b26715034390a1f1648cd35b1f0614baefcd2d7cf27530d6cf8e26f553ecdbebecbc1f6b0f2d3f152c5add956bae4422470d5522af30f13dbeed7580f2d3c9404cdbacd60bba697e85aee7e54ff7b4a6217cd29730c1ab867cf530de44478ab8c3e57c51866136b0497b89749c72c2fb8ae2b9cd77ad8c6d1af8878b66f64acf9df52b15d9bff07669794a751cf198cb5b52228d9e810321dde0381b9e294a60651e199db8bc0784ada92d86dbaf246584dc6c482ae93fe74cfed9d2e708f49de7513a07cb38724c7ae1cc3a2648c1c394fa85c56043060ca058bf7dd4dbe8c515a8057d7c56eed326905f25f00d091a9f6a2e5c528b670ed8d20a1338100dd2df256b7038ca7b92675138ae0283cb9840c9363a320d4ecca6e37bce9776ea21add8af8d470a33dea35c40e2fe88952bb3791de1677e7b9c32acb116e2282c2c78875c685ec1621da3bf69c3ffd3cccd9f0f0b08fe8f1d126f9db0440280a00dce41ed7a43ec3e6429f119ba69c536d6e384fc39715c54bd37d0de9232dc2cb4be2c437cd2b225d1e663e10e49c3de42bf6bde842fa49329adf64d81b1574c368a443aca940dfbe491a33b63db32b3190fe67dfb7fb86994eff1c294fbcc11ceb35ce80a600f80b8c79e60a88a9a38856535203daea2878362368f2e1441f5252878b016cd943828f2eb46da23adec24265b6af97693e065848af0157b3a6a6c65a04b0bcc8755eb1acfbec2792364ad0ad226d5c5a3e7f9ab49de80a49acf8aa5c7616bb4a67c26bcbf466eef8be47fc155ef610c790591cecdb2173295bec56ebf4fd91ef9fd499fdcb68f36e11e6c618b84692cd0ec332c32fa652d952e73c3e3dd35c55a9c05f9b049821cefafaf3a59d7680aa9ce02472e2fe5055125c9b9ba2a7b25d5f6906cf88628b994085604f93a3f72c71d81758c471ffe2e3aeb47a8c17fa5d75276d4fb1123b94098ab68066b45f387ffec1d1c79ce8d905705fa504c8d6811cdb28ff827c1848292ab86f43787157dd05764ec1482f6adcd99c3d54b85c1896083cc31b5c8026d377cf8a4ca5a18cd75f84ae7461a81045c0290558c20fa6956c4f58755dda891ac458a6c915a2076467e537eebe355505fcc2c973695d7dea386a52d2155de2dcf4747ee1374bfae34f1e26bc7f26036a53735013c670e5a97765f637723a0404931b578979b94f25de1d78b8bd6dbc8190112f05654fcc37a2e3af0cb2218c27af91d96b4dac8c15c7891b08e339780fd9cbb3fc54ee9521ec8039151ae5b447e7d818535cdf3f51fa49a9099af7774862866a17bd8cc15acd395773cde28240aef35970651d141b1b4dd950f79db94e41dc623161575815f52f34b2c009c622a8dc0f5e3841a36edfa29f450341137d0a61620dc62db96d6a54702d96b3c71782051a54cf1dd63fb6ffac8adc98f0f85c2d472018d4129e2458df225c357e4c77af6284500ccc6512dbf2368e1057a2a1bb6e95cf5e2421fe6f0b616ece11b16ee36e39ac2d9919423c7d59e77810173c6d6395a93592b4626886ff32925dfc8d6d252ca7b642a8f96bec5b034591c8a8dd5e5bef050e3250fca3698de501b4147c104889e5653931be758151adae8edd7c7a859048951f53eb462b6eb17b571b9324b9e45172bb5b1c93c6923255fba2305ca28cde0c57ec6da95269c836cd41e3cc9f24116267ca0ccff81d644843f10689364df823e60110d295da8a109b616f77464182f1e933abee28bfbe3e893bd059ee8983a0c28621dc1d734c04ab7e3c39650ed778a7afb22e811aae45b0cbd8f2be085e01ae9ae29d98ea42b353f053e1b3e62f0260fb4aaf91c94bedacb06c9814b67792cfc18fbf0c74004714de8146a771fee831a8819432a549765e3d98e0381c4a7595d38a2415dee9b38714ba48f3c1346c2e5a92f5a8a80ec390e78e5faf01ef784e7f9a89746988302cafe62ebc6bea14110f831a65c195a164741beda5d652b95a05b22573d231f7376b3b80335d3fa56e8e72c2dbc695f5252b01966864fc7228549da767b82d7752558f7ccdee1fd86cf25b09c0bf84e6286df14c5cfaedc4529f20863117eeab700bd3cbfdfffa778aed414080fc42a8bdef1901c6d770399857789d317faa24cad19459b7870e7acaa3d6eeab55af56976c683bf101caa052643c878fc505476e8e9e47a9cbe4a9de664d58c79c5c9b66a524c631975db9d4bab2706e97e207a4acaad781d453d39f7a13297459ca8fd3c5486210568907e32505764e8ae1315c2c38b82b8a2196ddb0ba106aadfe33e9c80d6fc404353b4e44bc6695535f505b2e850f3db9741e6aab44cffa74ab724f1a064f4a6db4f5ad8eec214dfd50f7a48b42faed430a590e582fd8af38c59dc0732f03a39130abf80bd7cb216224990b0290f837c605dea7c9ed496a879ca50756c22a92036789068b7ee0b4680d98b0e5a2a3e3087a6eb25e717d18f393ec21ccb7f3e4216999d30ca8589fc7306f11d49e2a2b7c43302697d17b789c3bfb8b1cdbf4517033b234913ce80685bcda0ee097f8a669054bbd016d0f6c307acc0cd308d59cbdf7f87e4aada45e74bfef42954633481911d034ea97cac9323a4799fa82d4714ea6c8afe0da1efa2e9d869e1aee36a5d67b2d0511f77de5d325ff0b42e06c2bd8551cc0cf5cac7c958f9a625ce53dbf76217b52e473d57d1c906e24aa8c34d192ee6fb88cef39afd66b847e6ea395eaddc45d12a1586eb769fbd21b955ce3a499ec868130c8a6f22abda5a5c86c7acf53fec0d1373feecfea2a35039b1dd5f875e715a28224a278ce96ee79c13593e2cba3025232e08e9214042ea99f9380e35587e160a00b41b70f1b0eb4dd71b07336f46079c25be95471de8b42a9f4fb03a1ac104d4ec1ac2c3acd51058d10ca9d3b7b5657d7dec74845d0447fa39bda1fe7dfeaf26daa8fae39fbcdf733ef7ce643572c5d5feefb350df7bd18c9235a41ecae829193e2f47b26408a7b8e9e844158ecaf50b395722a6a476a1bc1212d9b3430c09e802f0d3ef353abbcf29e0fe0358237e2049d1f93e660f5ded31e438b8e7393b68cc6880d4901044081464687079bb02607a4977416ce5d1823d1d9ebcf7562219a2bf767cdc7eaf0a159fd12431106a23e403812c4d948908132242e1c97fabbd69a565b58e922d13a728e92b04c877e05e6e4d877a9d0a3d094305d89495cae047517463b8cc04fff0adee7f44858a6acba6c5b763447b03a42c1918dfb70f54123c18920b0597363af65b66eee6962d91221d23565ea50462518a8e60fc5ff7964e11cd80d04bbb2412e29933c293db3ec78a04f38802ace93251af084677107f9b580f4890a1c6bd45e3225364a042ca09a6a6a5aa53d46f1e3b407fad951694d4c3742c43e10125e8699f48a8d133b8074995abb90e6c1d757aa773558d4a4aea451dafe0aa9b4c926efb29afea8d85959927d431b3809b69c2e65b59e30443c66cc6f864c6eafbd7ef32c8eb7a1dc6a663f5e02acc2249a3a98c91ca21a25544af94e246616c099a4aa12923ffc2ee23a3694098595e2b8a06cd236b39c4977c6e3a1e0a98b4120a0c360bb9127e332cf3dde68d99cb086b9b0ee25dc287e2d3f5420330516cac8a4e04449cb6076c795274f1c54b0ff8d554f38526b09eca3771606195c5c51c7c995548e91171002ea86bd4bca9c893691fae0f689feaf12201d31d0f2a1a3a9ae7e3b70d787bdc0c3a2a76c9b5713ccac9026491bf43b5323140ab2a0547d84ab83a48369baf87565bd8733c6fb9cad027f435f9ef0cbe3c402e5182fc8879b7216394b33b855f48ca8b1f1ac798bcdaa6dab95be3da780be57dff876a641e71f5da35da0490d0639b9c178c95fcb0e1602ee3f645367b2c684b90cae2d4722a1d54afab89642e008970d172d229c1fa4963635b5735e3c2c4ae30cc47a0a906c85f7b38a9335a24e87c2f74aa5c94902d4ddd087a9d5f65cc3fd5cc543545854a47a4d0a53ca653be46c4c0a5bec89c253344b000bc86379a86f2fabde29f2b56e08d6eb3278689e3611b97b22bbfee3d3242b7451af288f34c3ad642ed7352f182baede02a5deafa1844f1084bc4b5bd9ebac1e5766f7038c65868c970dcce1525c4ba4557cfc8647ec40f9043c4b7027350472693fb7371c7c212a368f1191f1cf1872aa3de694ebe05ae0a4f5ede7131856c643d7bec87cb58c02bc22d4df105cdd1810d4b9c07fb41f4cb824c03ac290c3a9d5a76492491616355679ad42bc98b06723ec035049726cc3ffc72072ff46ec39a9e829374b6545d5a2b5ccf34fec3f1755ca0e6e5b228e0674d8df64e3b8de4ba669490198692837079a8828cb0c2090ded5cdc360f67f21057826e4834901f4d306114805513678e4823b290a28beb8204ef99ca8e0d6429c7aa3e2d6dc5ea23ff89d325352fe7c3aa6f47f67d26cca3c51c383b62d27b009235af15ba039e84cc5755e61052f18ff2b16d2e7fab90e94cf30c36b68c2368727cdd247ada97ce1b5ca19e47f42a04c49c1636a68d74e5cdfb53a237d65d3dd421b24ba59ee8f6d47bb3e7bdf2472eefd148a9cff0422d8fdce5a87c43ff8c5b33ec890e619a190f147800cab6d1835ba2bfe2d932e9e595a87246346c5468f1f7db9bf08cb1158e2dac85ccd8ffe8189e30bf0487cdbd5d1fc1ffe34130b8b1a2191c0858d64f1e216a45fdd3e5591f787914cddb4557c88e6f5781d486fbd0c2dd7b68a9f3a9e05d2d29e7aef4f851d421a26d826fb69d1063815db49414296c7a930467649f5b875cac06134f9bcbc2d6bb9c88084a6ba106a6542bd03a786995d03f8c515cf66004b64f5f7bde8986aa02bdd84af0c9f6f9954e86f046950eb139b09f270be9f4b5fdc355a972f0e136144f1fef3be3d48dcf2929464b8bc255c4e814f000db912e999e59d37c272bd5adfa4f68b237bc851c2510b358d194adbd97f6ee38458de219fd1faffa0ab3dc0591aac11f61a3a9342c085d23b6c844eb3ce8c0dcdac17553eb1316d89ede3c84622224d63120f1a23cab58f5462386ddb407afc118398e304124df2358778987f85588356bf2a89874b9b4f83e326e36c9dbbc7d761fcb81ab62a72f0aa03107a5410dfbdc35b8c25e048c25ddcd79ad53ff6cc1b00c294b420c15627fb66d76f93fba4e560163f51766fa15d207b63ade8db5d216b17160b167c098cbc26f19837e15a6bf3ba37f93d5ecce0c14e2c7c780debfa99eba75add973226988bfac7abc0d4f0418469ba08cc4305c60672c97bf71e832de7d48b7cea61ac81e67de5e4971440342624fda46bf6b8af196827b9f85b0ddad4746b67c4ba2d7d4cbf1e7db99ef0a787646414d6a779a05643a821e6c7d22cdedf473e70050f4953d66df272f74676904ec5129fd5469762d8864a3a15819ea7c5a1716b628862e2a4c318d7b96384b75c0de290c035d3444bcd196a3f5ad1464eaa0e0c8a3190cd3d00f9c5cee18c86fed91624784685acbcf82fc86a928449460dc5b791da0e973f110c6e7230bd5b3ec98caafb6d4ae0bbc515664ec0251e66d8f210049797d280563418218f07e430ce2096600e2cb2c797230b403f21ee8e88d2c3b03ca7b3f272b0daf2ce1c2eb069768d92199b31fec315da1caf22e5a422410282772cb91f9a52f7148628889077b3f81d145b8721db54046fcebdf6d9c358c1578f120696e661f51d1d99a44448873e45f02fd7682faf0b7735c9867aa8673b06a91448f34e3f73f997337b47e4aa66248682d88f24daf2bfc0deec8d8a6dedf6b707da048eb899dabb34c4fe53de0fde66e2785d21c790ab1d1584bdfd96906a3ec1c269148a6943da1c537baca09b8adc5b6ec812888e232c76c29c0db0c1c18bbc93a81920c6509aff95fb46704b342b8eafe9581c43d61a65d135da188d4d942bfd0effa1db8e068cb6618f8bff6c0fe227619aaaae571601e749fcedaa100be7386a3c8b68694eaedccb2b9d2e0a6356a0f8bf1b7a2fdb3cc696321fb76a0c35e3f3784164ea184229a60deb76fb919e6860813203a9cd502bb542a216ebe2a9b458daf52df6591c6c5f16ec34b4a35f5c0b5edc4868fe788465f70bc7340ce661d43c178fb6aee2569d4e1f4152d1acc5a32879a6c28191828a8410d28959acd2e51a37619f3ec1c72e425a37065f49a1cccafd1f2b517c2f058133b0a36ff95b6d16274a7776df502bc3909e67bce5d1bd8ecd3d86dec0344c14448ced0428b06e309ff6b61ed1e128fae6728c921f3be87180fbdef2faa17014be6a9085452d7ab3133f51e41ed39d14972bcda0449751868f847a71166f6336df799fca7118e8b474e077d2ee6b73be947c9d3e53d662c915cfcff1f09d67268b0f2767ee0dec62708beb43be805c0b4511b97979176df458fb1a925ffbb05e4b7c58a20946a2ae788f8c4c1559011bdbed1cdb72b7cd8b3bc07f4c281a43ec59b2e169ea9fb9fe106257e8db9207c739374535f7731ff817fd6a97da5aa710192f4d4a88abcfc03ba764bc7e5b372ba36252ebaa2cfcdb05aed4e0b27401e1befc84ecdaa343a4a8185f6f0290ffe91d75b1b2518dd4550a4473e48499c5a92fb457ad30aa3943fb505c14649e7e1c73824a409b28b62cd7363d112292325edefd2f03c936d84995bd6a9d1654f69ff2305fddcef8421c6fa5e95e0804d21326f29090661e8b7d29acad4ed70088e0a02d9e0c20ef28bcf6c6e37f0ea5e8d101018274b1a9581cb0e4ffc249c6ff21507ec348c2b295e0a78295c70db6da3f61e3e060097394d4dd297c791ef4b56be9b01a29139fd0b69e035c332179ab95b905fa9206a6469c25f5b040e6d41fc75c41af2551b1e653bb4cdea718bf56be7aa323ffa7caea162d9737f25854562a0e86ff89bb5933016132a74321b229255a7722120b1cabcc76bdf4bab94b18a321414558f4363d700eaea6b036f292ab2ccc250a1acec76075af3157ad8e301d6c8a38a4cf5c3de2693876f0454db9353919500d13528f47452c4986d3fe2629a3449e8d878f64d29b34b275e4fe742363f99640c3fd23b3d389f23ffdb261c466726dbbcb3c34afa274b28901d1ad577fd38c81fb19bd7550062bb85d31b513614780a02b6b5e3b5b7887a79b97532d503b43d1c7c48c96829feacef3c031665551659f32875674e20f38721cdc1e641ce9fe4e9dfb9e42bf08fc28ed0b03ef218d0b0e127b5046a9b965d8287fc07d20d688150ca006c79be06c7fdc9bb7910613ff3b5ba73d67e8dd2657407b021cdbb78ea5106f1646e9fab0fe2816f78a750ded955e761ba85c819d46a9e2a5ff21cdfc247b7350b0f8ecb1b82b1f991dba6d8b1e63cc69d4a7da94a552e695c6ca72da158fdd2260128890e396f7aa3b62023deff2db64c9a39b6030e9b39d99e280a4fec1683e09bb3787305d649f7ebb7bec1c75b1a6ea0259b734c14a0a2558a99db4acabfd497d51adfa4a46fac0c29d21fc027f0488fb7a2952e576fc9efa0c6f3bbb9725ee8556fb5ab129aa3e3ce912b2df7fc3c15463f649844144f62493b9ca098c5bca1e14e2148aea9ef0b851400b32db71827c0b0b5f8347f36f3e78f2f165f8e3fdea653ba81865efca377df1273b6a1f5df53aada0cc162aa096083a8ff62f6bd1096861fb1aae2851b4e55feb071284c12c6993dba58a4e938ec33d897b5333d67da388a69569a5762165ac069b0f9c00cca0bd1139c96e8265c865c2f8e7c39063bc077f795749cb6076df4588e2b2d07853a1443fcab992c7be89857a004fa930864687868405f9d06cd44a0122e2df619de0c07ddb7bd136ef66b5a49f7c6251915d5361fbf75d8acc6471b2aec8c0d8499c78ea80511fe930ed6f8ff4406b5c061678c0e23dc998804dcd4c7fc166356e536d84a59bc35fd2c111c7aac8ac8c29f5310f40bf0161bc7950978b886f0ce03e2e053e0d426238e9401c126d362e59556ff6bbdd7886000b65fde3390be7c2e91df00f2e15bdf77fc84040f705fe1756c4402679479a18fea45b24ac145764d68c03b2ace1ad2a40c67b027b5a81c8e29ac5d69ea33c39e236c7f906f6a8445b7a88ddcedc5d7a5b3326e9192aaa4b13e12469a21b34c6709660dbbe4844ff9aab8c1af58a076ce7dbe92a63aeaa409de0aed0d76b0da0578f55c4d6cc5b77637710c3498c8cc4718da0efefb279511b4a026d613e50a3fa51401fc786f81708e619a9369b6d9d5daea06836850917d835304fa3d6dbb4dd72ac7e624587ec2437f466db42e2d5c8bb03eb389c0482c087b6c2ea1e81f13a0b3772e452c3d640583c9705267c10d4d5f88f8322d2df8a55ba2b2fd5c7cb1b905a0c2822bd46d86e73018d96953491224866bf73b315490b2cacc59a13c14ce68372fc66c6f76a3ad62c9cbf734bf90b44a0c04f2f7545d501c91ced47854b3a5d3773420c653558b73d3c59d7d3c1689db1782f2ef33fe06b7418229a34768351cf11f61eef9f3839d3e5530af4d089305a32ebd80c97223b67047148a36d8c3eca73f31f2d94c04d70e89173ee68501de0c945b74530795598204e145adc81502d83c2944ecc9a6c42db1d7cd91682e05051e93f714505d75c1553d85e4217ae2af8f40110cc1dc88a3b34653871ecc50420cedba771ff2502b58f3bf353d62b68c365f4c7a6603f3c2a238d3e98594f1ba6e1b08eada2918519a628a45ecae4b17fb39ec117fa16c9448fe1d21645120ba850e71e2947b54cf87c599a6a2827263640041367784ec51b9c37cdbb3627f76f21955d9876ea0283ed22b5a07cec34792d6f9dbb505184eec9ef7f35b8237fdaf2b05fad8d98ce61c635c10fb5d803f9096ed9c7205b421482557f2f7c6807df1f893568181371df13935446ce065beb87a55c2dea524b53c6d4fa06a7806e31ddd78bb4704c5764b66c793128a76b159d914f5d76543df761e1db72935277f57a7a7b2ab9e7fbee199d6b4638094cb89b66fbd8c82e179f53234e5abb6ec764690885115cedd1677f5c8b2887ad48de4af560fa3fdcf7350cc5e6b6b90a23541c6174d906278d63a7b850380c412984e8b16aceb3971f832e85ffeec27da4a05c46811bb9dc4f3693f6036a1fe551da2d57544f4c85708b06f137692d30fb2146cdfad11a65ecc4e0e1afa9f25ff22858b14efbec3557074fbbf067122a39370193dfeb1b41e38b24701506d64986a4cad8853a2a39028e29f46e08b4ea0a88d180c6762ff166212ce8280c6ae78665f9c70803a313030a3e69c41f93f246738e7d5f9862f9f1d126a5fa1d67b18c6a6480c8ee7f5f5b5d24740b6d55fb64acd9435b7d0b6e13abc83a76e075387f6b93296293815504948933d97c33edd95a62f0c28db4d179e49bafceec7973b5657285a7eb9420b22caad226aa8b055495eba5974a94b17f3c18928539f7f4b03e140aefb83f2d5c2b96f74bd2689ef465777f03672d0d744f2aa232e851e5da6dbbea3ab5948b65a60872de801be0665553d27f8b831cd1769bb4cd61140cec1c9bc6677091656eff149a9546ccd453beb00c4a1851f7a67921978c5ee2ca83cc84ad7c5687c556f227f97a6271f072cab034052b22046be0bfaebad6df055d007fc5d7b6cc63aacf4ec075a0e93fc4adf32819397db79d38193450e8fe88e8effb71030ce29e62d64497c1198f8190d3b8b25c8eae993fe86e3ec3519a7a56d533462bf20b7066894af483442d6145cd3702592f6ce789526904b9a916e1c26462338ce9dabbc4ced46be7db7203dbbb84a3bd575a5ce2a624141e7d57ee41481a24d9fce04a6597a376d843ec7f024393bfa4f043a3f0a0ee18c5c8d990cff3c9b6bd7caca182fdf365d03983d95c5bf21bd7cd1929e57817dcb8d82e932e9d4e293f7c7adbded7646c56728c99afde5bdd68e219a10fa986766ac55ba1f05e6e73f0ca5df6826258eb31d002bfd3e0500171cdc9f0dd4fcb9955a058f83b15444ec721c431b9dbf103c252bb34ff11e2eaf153ff5a061dc20f386297e36a7f3ca746aa3a135e479e0ba55cceedb69a7f7624fa975e048d763b3fc94aa7d96da972ddee7f91b7f00d6c1cfde389f4ab05c799aa106556611cd123a26ff6a23a4057a3b2ff2569dd14605968e76993965b7211c5b7405ff5c89cdcfb36283f7fa82ff1da9e26d0269fac8daf9015b93b3b536c5b00a2c7427e199d9807be9893b67f03a9a1970a1a046887e0a8dcf4e6a2cee57ff26b8a664f6c836b28b20082d0387e02d6d42adb8c5f126668c2292cda1123b85e39ffbd389d832138eaa1500b06f16b0d0e5505c970152194e30f8bc3a2ef01385533daec68f3246ef72956036ba3aead3d62e879dcacb7f505698c6687996ffeeefe7d2a0c3648968aec1e2b864a9b36b8f08211e8178883a27a079fe072f08ca49e5ef1ab910ff56ac7d4db6a0e25457c230cf920acad2698536ad3c6bbea096729e2687057b1d998103c0dde7df3d699a35e5b7a297dcae7d42dc5e6a138adada3247fd200f3060be71eaed95f6e17039650bd67ed21569598bba030ca1063affaef3ad2f17d74d33508a3c74b0a9a536a7c4109ffb9bd1e1ab3ea36555c2522f1cfad903c8a51e91cdff895146b56b83fff4680123b35a193c106e845f575c9b983e338793bddd57a0c46acd9298508e556d242d62cdb45e9c0f9bbdcce45a259ae0ffd57dfeaf85c64351e0cf392c4220a6d10c7e178ef8a88c4c1ad63c131cd92df268301730bcfc01f14882e51e9826b793fdfdf5f14ce7c44c59ed399e3a56ab3ede222dccd25736b85ffbf267efd69be2ad7e07a9b6360dcfee822e70f188722d0443239533c664b51d9d6bf46ccf8087116d5baf8dd6e0077800d84c309d7d749851f45d5f843cc369c00fadee5971af41f9451fdcb24138a1f19b9d3f166d6af9a4ac580b8b38c3ae8f0822640222d3563c611071c5ed0d370566ba597913dc6beed7470d7530b1b8ed213a3e6f37b15983e63f61de57cf0996250af0cb47c8c2cbe374678edd248d14f970fbe3c24a0a35a08b517af001b7fcf8cd9a01a4e909a1247600880a0db14025908498233325773bc70c907bffe93a537d60ef9590641987f23e28bf77550609aba6d5e1b13e79b1990ac9ab8b70e96ccf1c7d685606ea0194b40c68e3fcd64b3da521b770052221807de6c4186166a9d7efed120c978fcdb8380d5be361fcb52b5728831d367f29a8879a61d7eab88a95265b583c44068374cd3f26c23a1c62cf33b8f647c9891733ac9428d675510a6c9dfe5b0489c446a8601bd14bff6f637cb030b4dc60f8b17af638ac775a9339d7a4334cee79d830d735d3186adbc52e733f3fb410d20764d418f3863ed2acc874ca4be1aa47df5c24692638d703df3dfa0c7e7a1f3e9993b8f0e7607b4969532a97dcfd30531b19fc76c331b676881217067428c1403fce556557baeeb389b4146fa043d49680239df3182fa576d48c9d40492c78d029d149f1 + 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark{restore}if +%%EndResource +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 223.20 C +ski{/Helvetica fcd /Helvetica-ISO8859-1 fdf}if +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<545745422076696120465450> 146.88 222.24 C +0.000 0.000 1.000 RGB +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<6674703a2f2f667470> 158.16 259.92 C +0.000 0.000 0.000 RGB +<2d783530302e756e692d74756562696e67656e2e64652f747765622f747765622e7461722e5a> 213.60 259.92 C +0.000 0.000 1.000 RGB +<6674703a2f2f6674702d783530302e756e692d74756562696e67656e2e64652f747765622f747765622e74677a> 158.16 290.16 C +0.000 0.000 0.000 RGB +/StarBats ff [24.00 0 0 -24.00 0 0] mf sf +<22> 112.80 357.12 C +/Helvetica-ISO8859-1 ff [24.00 0 0 -24.00 0 0] mf sf +<537570706f7274206d61696c696e67206c697374> 146.88 356.16 C +/Helvetica-ISO8859-1 ff [18.00 0 0 -18.00 0 0] mf sf +<747765622d737570706f7274406d61696c3530302e756e692d74756562696e67656e2e6465> 158.16 393.60 C +gr +%%PageTrailer +rs +%%BoundingBox: 18 18 555 759 +showpage +%%Trailer +%%Pages: 11 +end +%%DocumentSuppliedResources: font StarBats StarBats StarBats StarBats StarBats StarBats StarBats +%%EOF diff --git a/contrib/tweb/doc/Presentation/README b/contrib/tweb/doc/Presentation/README new file mode 100644 index 0000000000000000000000000000000000000000..c91988b990b67ec477cc5b804dfec6526893c489 --- /dev/null +++ b/contrib/tweb/doc/Presentation/README @@ -0,0 +1,12 @@ +doc/Presentation/README +======================= + +This directory contains documentation concerning TWEB that was presented +at different occasions. + +- DANTE-01-99.ps + + Presentation of the dynamic features of TWEB (i.e., gateway-switching + and dynamic re-configuration) at the DANTE NameFlow meeting, January, + 18th, 1999, in Utrecht, NL. + diff --git a/contrib/tweb/html.c b/contrib/tweb/html.c new file mode 100644 index 0000000000000000000000000000000000000000..7406c624bf236ede8df756284b05d485f4900a77 --- /dev/null +++ b/contrib/tweb/html.c @@ -0,0 +1,939 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* html.c..... * +* * +* Function:..WorldWideWeb-X.500-Gateway - HTML-Procedures * +* Based on web500gw.c 1.3 written by Frank Richter, TU Chemmniz * +* which is based on go500gw by Tim Howes, University of * +* Michigan - All rights reserved * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* August 16 1995 Z D D V V * +* Last modification: Z D D V V * +* May 28 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: html.c,v 1.6 1999/09/10 15:01:17 zrnsk01 Exp $ + * + */ + +#include "tgeneral.h" +#include "tglobal.h" +#include "html.h" +#include "init_exp.h" +#include "support_exp.h" + +#ifdef TUETEL +#include "tueTel_exp.h" +#endif + +PUBLIC void print_attr(ld, fp, dn, label, tattr, e, flag, doNotShow, glob) +LDAP *ld; +FILE *fp; +char *dn; +char *label; +char *tattr; +LDAPMessage *e; +int flag; +char *doNotShow; +GLOB_STRUCT *glob; +{ + char **val; + int i, gotone = 0, firstline = TRUE, valid_label = FALSE; + static char *nlabel; + char imageChar = 'J'; + char strbuf[BUFSIZ]; + int first_of_same = TRUE; + + nlabel = ldap_friendly_name(glob->friendlyfile, label, &fm); + + if ( (val = ldap_get_values( ld, e, tattr )) == NULL ) + return; + + /* check if only 1 value and this one is in "doNotShow" + if((doNotShow) && (val[1] == NULL) && (strcmp(val[0],doNotShow) == 0)) + return; + */ + + for ( i = 0; val[i]; i++ ) { + + sprintf(strbuf, "(%s)", glob->la[0]); + if(!strncasecmp(val[i], strbuf, 4)) { + strcpy(val[i], val[i]+4); + } + else if(val[i][0] == '(' && val[i][3] == ')' ) { + val[i][0] = '\0'; + continue; + } + + if (!doNotShow || strncasecmp (val[i], doNotShow, strlen (val[i]))) + valid_label = TRUE; + else + val[i][0] = '\0'; + } + + if(!valid_label) { + + ldap_value_free (val); + return; + + } + + fprintf( fp, "\n<DT><B>%s</B><DD>", nlabel ); + + /* handle photo-requests */ + if((flag == BMP) || (flag == JPEG2GIF) || (flag == JPEG)) { + photof(fp, flag, imageChar, dn, tattr); + return; + } + + for ( i = 0; val[i] != NULL; i++ ) { + + char *vali; + + if(!*label ) first_of_same = FALSE; + + if(!*val[i]) continue; + + vali = char2html(val[i]); + + if (flag == URL) { + urlf(fp, vali); + +#ifdef TUE_TEL + } else if (flag == TFUNCPERS) { + tfuncpersf(fp, vali, ld, glob); +#endif + + } else if (flag == DYNAMICDN) { + dynamicdnf(fp, vali, glob); + + } else if (flag == INDEXURL) { + indexurlf(fp, vali, dn, glob); + + } else if (flag == URI) { + urif(fp, vali, glob); + + } else if (flag == PGPKEY) { + pgpkeyf(fp, vali, &firstline); + + } else if ( ( flag == MULTILINE ) || (strchr(vali, '$') && + strncmp(vali, "{T.61}", 6) != 0 )) { + multilinef(fp, vali, &first_of_same, &firstline, &gotone, nlabel); + + } else if (flag == BOOLEAN) { + booleanf(fp, val[i], glob); + + } else if (flag == DATE) { + datef(fp, val[i]); + + } else if (flag == MAILTO) { + mailtof(fp, val[i], vali); + + } else if (flag == HREF) { + hreff(fp, val[i], vali, glob); + + } else if (flag == MOVETO) { + movetof(fp, val[i], vali, glob); + + } else if (flag == PRE) { + pref(fp, vali, glob); + + } else if (flag == HEADER) { + headerf(fp, vali, glob); + + } else if (flag == REFERRAL) { + referralf(fp, vali, glob); + +#ifdef TUE_TEL + } else if(flag == FAXTABLE) { + faxtablef(fp, val, &firstline); +#endif + + } else + defaultf(fp, vali, &firstline); + } + ldap_value_free( val ); +} +/* end of function: print_attr */ + +PUBLIC void form_attr(ld, fp, label, tattr, e, multiline, add_empty, glob) +LDAP *ld; +FILE *fp; +char *label; +char *tattr; +LDAPMessage *e; +int multiline; +int add_empty; +GLOB_STRUCT *glob; +{ + char **val, *s; + char buffer[1024]; + int i, gotone = 0, line = 0; + static char *nlabel; + nlabel = ldap_friendly_name(glob->friendlyfile, label, &fm); + if ( (val = ldap_get_values( ld, e, tattr )) == NULL ) { + if (add_empty > 0) + if(multiline) + fprintf( fp, "<DT><B>%s</B><DD><TEXTAREA NAME=\"%s=\" ROWS=4 COLS=30></TEXTAREA><BR>\n", + nlabel, tattr); + else + fprintf( fp, "<DT><B>%s</B><DD><INPUT NAME=\"%s=\" SIZE=30 ><BR>\n", + nlabel, tattr); + return; + } + fprintf( fp, "\n<DT><B>%s</B><DD>", nlabel ); + buffer[0] ='\0'; + for ( i = 0; val[i] != NULL; i++ ) { + if ( multiline ) { + char *s, *p; + buffer[0] ='\0'; + if ( gotone ) + fprintf( fp, "<DT><B>%s</B><DD>", nlabel); + p = s = val[i]; + while ( ( s = strchr( s, '$' )) ) { + *s++ = '\0'; + while ( isspace( *s ) ) + s++; + if ( line == 0 ) { + sprintf(buffer, "%s", p); + line++; + } else { + sprintf(buffer, "%s\n%s", buffer, p); + line++; + } + p = s; + } + if (line++ == 0) { + sprintf(buffer, "%s", p); + } else { + sprintf(buffer, "%s\n%s", buffer, p); + } + s = form_encode(buffer); + fprintf( fp, + "<TEXTAREA NAME=\"%s=%s\" ROWS=%d COLS=30>%s</TEXTAREA><BR>\n", + tattr, s, line + 1, s); + /* fprintf( fp, "<INPUT NAME=\"%s=%s\" SIZE=30,%d VALUE=\"%s\"> <BR>\n", tattr, s, line + 1, s); */ + gotone = 1; + line = 0; + } else { + s = form_encode(val[i]); + fprintf( fp, "<INPUT NAME=\"%s=%s\" SIZE=\"%d\" VALUE=\"%s\"><BR>\n", tattr, s, + strlen(val[i]) > 30 ? strlen(val[i]) + 3 : 30, s); + } + } + if (add_empty > i) + fprintf( fp, "<INPUT NAME=\"%s=\" SIZE=30 ><BR>\n", tattr); + ldap_value_free( val ); +} +/* end of function: form_attr */ + +PUBLIC void do_pict(ld, fp, dn, type, glob) +LDAP *ld; +FILE *fp; +char *dn; +int type; +GLOB_STRUCT *glob; +{ + int rc, i; + struct berval **val; + char cmd[128], buffer[1024]; + char *s; + FILE *op, *tp; + LDAPMessage *res, *e; + struct stat st; + char *cPtr, *ptype; + char *tattr; + + if ( (rc = ldap_search_s( ld, dn, LDAP_SCOPE_BASE, "objectClass=*", + NULL, 0, &res )) != LDAP_SUCCESS ) { + do_error(fp, rc, NOT_FOUND, glob); + return; + } + + if ( (e = ldap_first_entry( ld, res )) == NULL ) { + do_error(fp, -2, SERVER_ERROR, glob); + return; + } + + /* + * old behaviour: use "photo" or "jpegPhoto" attribute + * as indicated by type-argument. + */ + tattr = (type == 0 ? "photo" : "jpegPhoto"); + + /* NEW: if attr is added to URL via "+" use that attribute */ + if( ( cPtr = strQuoteChr(dn,'+')) ) + tattr = ++cPtr; + + if ( (val = ldap_get_values_len( ld, e, tattr)) == NULL ) + return; + + s = tmpnam( NULL ); + tp = fopen( s, "w+"); + + if (type == 0) { /* g3fax photo -> xbm */ + sprintf(cmd, "%s > %s", G3TOXBM, s); + if (debug) fprintf(stderr, "%ld bytes FAX!! %s\n", + val[0]->bv_len, cmd); + ptype = "x-xbitmap"; + } else if (type == 1) { /* jpeg -> gif */ + sprintf(cmd, "%s > %s", JPEGTOGIF, s); + if (debug) fprintf(stderr, "%ld bytes JPEG!! %s\n", + val[0]->bv_len, cmd); + ptype = "gif"; + } else { /* jpeg direct */ + sprintf(cmd, "cat > %s", s); + if (debug) fprintf(stderr, "%ld bytes JPEG!! %s\n", + val[0]->bv_len, cmd); + ptype = "jpeg"; + } + + + + if (http == 1) { + fprintf(fp, "HTTP/1.0 %d OK<br>MIME-Version: 1.0<br>", + DOCUMENT_FOLLOWS ); + fprintf(fp, "Content-type: image/%s<br>", ptype ); + } + if (request == HEAD) { + fflush(fp); + exit_tweb (1); + } + if ((op = popen(cmd, "w")) == NULL ) + return; + fwrite(val[0]->bv_val, val[0]->bv_len, 1, op); + pclose(op); + if (stat(s, &st) == 0 && http == 1) { + fprintf(fp, "Content-length: %lu<br>", st.st_size); + if (debug) fprintf(stderr, "Image size: %lu\n", st.st_size); + } + fprintf(fp, "<br>\n\n"); + + while (( i = fread(buffer, 1, 1024, tp))) fwrite(buffer, 1, i, fp); + fclose(tp); + if (unlink(s) == -1) { + if (debug) perror("Couldn't unlink temp image file"); + } + fflush(fp); +} +/* end of function: do_pict */ + + + +PUBLIC void do_audio(ld, fp, dn, type, glob) +LDAP *ld; +FILE *fp; +char *dn; +int type; +GLOB_STRUCT *glob; +{ + int rc; + struct berval **val; + LDAPMessage *res, *e; + struct timeval timeout; + + timeout.tv_sec = glob->timeout; + timeout.tv_usec = 0; + if ( (rc = ldap_search_st( ld, dn, LDAP_SCOPE_BASE, "objectClass=*", + NULL, 0, &timeout, &res )) != LDAP_SUCCESS ) { + do_error(fp, rc, NOT_FOUND, glob); + return; + } + + if ( (e = ldap_first_entry( ld, res )) == NULL ) { + do_error(fp, -2, SERVER_ERROR, glob); + return; + } + if ( (val = ldap_get_values_len( ld, e, "audio" )) == NULL ) + return; + if (http == 1) { + fprintf(fp, "HTTP/1.0 %d OK\nMIME-Version: 1.0\nServer: %s\n", + DOCUMENT_FOLLOWS, version); + fprintf(fp, "Content-type: audio/basic<P>Content-length: %ld\n\n", + val[0]->bv_len); + } + if (request == HEAD) { + fflush(fp); + exit_tweb (1); + } + fwrite(val[0]->bv_val, val[0]->bv_len, 1, fp); + fflush(fp); +} +/* end of function: do_audio */ + +PUBLIC void do_sizelimit(fp, type, glob) +FILE *fp; +int type; +GLOB_STRUCT *glob; + +{ + fprintf(fp, type ? glob->la[21] : glob->la[20]); +} +/* end of function: do_sizelimit */ + +PUBLIC void do_error(fp, code, status, glob) +FILE *fp; +int code; +int status; +GLOB_STRUCT *glob; +{ + char *s = ""; + + if (http == 1) { + switch (status) { + case BAD_REQUEST: s = "Bad request"; break; + case AUTH_REQUIRED: s = "Authorization required"; break; + case FORBIDDEN: s = "Forbidden"; break; + case NOT_FOUND: s = "Not found"; break; + case SERVER_ERROR: s = "Server error"; break; + case NOT_IMPLEMENTED: s = "Not implemented"; break; + default: s = "Unknown error"; + } + + fprintf(fp, "HTTP/1.0 %03d %s\nMIME-Version: 1.0\nContent-Type: text/html\n\n", status, s); + } + + if (request == HEAD) { + fflush(fp); + exit_tweb (1); + } + + fprintf( fp, HTML_HEAD_TITLE, glob->la[22], glob->la[100]); + fprintf( fp, "\n<H2>%s %s</H2>\n%s <P>%s <EM> %d: %s.</EM><P>%s<br></BODY></HTML>", glob->la[23], s, glob->la[24], glob->la[25], code, ldap_err2string( code ), glob->la[26] ); +} +/* end of function: do_error */ + +PUBLIC void explain_error (fp, error, status, glob ) +FILE *fp; +char *error; +int status; +GLOB_STRUCT *glob; + +{ + char *s = "Unknown error"; + if (http == 1) { + switch (status) { + case BAD_REQUEST: s = "Bad request"; break; + case AUTH_REQUIRED: s = "Authorization required"; break; + case FORBIDDEN: s = "Forbidden"; break; + case NOT_FOUND: s = "Not found"; break; + case SERVER_ERROR: s = "Server error"; break; + case NOT_IMPLEMENTED: s = "Not implemented"; break; + default: s = "Unknown error"; + } + fprintf(fp, "HTTP/1.0 %03d %s\n",status, s); + fprintf(fp, "MIME-Version: 1.0\n"); + fprintf(fp, "Content-Type: text/html\n\n"); + } + if (request == HEAD) { + fflush(fp); + exit_tweb (1); + } + fprintf( fp, HTML_HEAD_TITLE, glob->la[22], glob->la[100]); + fprintf( fp, "<H2>%s: %s</H2>\n", glob->la[22], s); + fprintf( fp, "%s</BODY>\n</HTML>", error); +} +/* end of function: explain_error */ + +/* Make "Move upwards" Header */ +PUBLIC void make_header (fp, dn, action, glob) +FILE *fp; + char *dn; +int action; +GLOB_STRUCT *glob; +{ + char **s, **t, hrdn[1024]; + int cnt, i, j; + pGW_SWITCH_LINE gw_ptr; + char url[BUFSIZ]; + + if(glob->pull_down_menus) { + make_header_pull_down(fp, dn, action, glob); + return; + } + + hrdn[0] = '\0'; + if ( strlen(dn) == 0) /* the root */ + return; + s = ldap_explode_dn( dn, 1 ); + t = ldap_explode_dn( dn, 0 ); + + strcpy(url, "M"); + for(gw_ptr = glob->gw_switch->list; gw_ptr; gw_ptr = gw_ptr->next) + if (!strcasecmp(gw_ptr->dn, "ROOT")) + strcpy(url, gw_ptr->url); + + fprintf( fp, "<strong>%s </strong><MENU>\n<LI> <A HREF=\"%s\">%s</A>\n", + glob->la[27], url, glob->la[77]); + + + for (cnt=0; t[cnt]; cnt++); + for (i = cnt - 1; i > 0 && s[i]; i--) { + strcpy(hrdn, hex_encode(t[i])); + for (j = i + 1; j < cnt ; j++) { + strcat(hrdn, hex_encode(", ")); + strcat(hrdn,hex_encode(t[j])); + } + + strcpy(url, "/"); + for(gw_ptr = glob->gw_switch->list; gw_ptr; gw_ptr = gw_ptr->next) + if (!dn_cmp(hex_encode (gw_ptr->dn), hrdn)) + strcpy(url, url_complete(gw_ptr->url, hrdn, "M")); + if(strcmp(url, "/")) + fprintf( fp, "<LI> <A HREF=\"%s\">%s</A>\n", + url, i == cnt - 1 ? + ldap_friendly_name( glob->friendlyfile, s[i], &fm ) : + s[i]); + else + fprintf( fp, "<LI> <A HREF=\"%sM%s\">%s</A>\n", + url, hrdn, i == cnt - 1 ? + ldap_friendly_name( glob->friendlyfile, s[i], &fm ) : + s[i]); + hrdn[0] = '\0'; + } + fprintf( fp, "</MENU>\n"); + ldap_value_free(s); + ldap_value_free(t); +} +/* end of function: make_header */ + +/* Make "Move upwards" Header with pull-down-menus*/ +PUBLIC void make_header_pull_down (fp, dn, action, glob) +FILE *fp; + char *dn; +int action; +GLOB_STRUCT *glob; +{ + char **s, **t, hrdn[1024]; + int cnt, i, j; + pGW_SWITCH_LINE gw_ptr; + char url[BUFSIZ]; + + hrdn[0] = '\0'; + if ( strlen(dn) == 0) /* the root */ + return; + s = ldap_explode_dn( dn, 1 ); + t = ldap_explode_dn( dn, 0 ); + + strcpy(url, "M"); + for(gw_ptr = glob->gw_switch->list; gw_ptr; gw_ptr = gw_ptr->next) + if (!strcasecmp(gw_ptr->dn, "ROOT")) + strcpy(url, gw_ptr->url); + + fprintf( fp, "<FORM ACTION=\"/D\">\n"); + fprintf( fp, + "<INPUT TYPE=submit VALUE=\"%s\"> -> <SELECT NAME=\"H\">\n", + glob->la[27]); + fprintf( fp, "<OPTION VALUE=\"%s\">%s\n", url, glob->la[77]); + + for (cnt=0; t[cnt]; cnt++); + for (i = cnt - 1; i > 0 && s[i]; i--) { + strcpy(hrdn, hex_encode(t[i])); + for (j = i + 1; j < cnt ; j++) { + strcat(hrdn, hex_encode(", ")); + strcat(hrdn,hex_encode(t[j])); + } + + strcpy(url, "/"); + for(gw_ptr = glob->gw_switch->list; gw_ptr; gw_ptr = gw_ptr->next) + if (!dn_cmp(hex_encode (gw_ptr->dn), hrdn)) + strcpy(url, url_complete(gw_ptr->url, hrdn, "M")); + if(strcmp(url, "/")) + fprintf( fp, "<OPTION VALUE=\"%s\" %s>%s\n", url, + i==1 ? "SELECTED" : "", i == cnt - 1 ? + ldap_friendly_name( glob->friendlyfile, s[i], &fm ) :s[i]); + else + fprintf( fp, "<OPTION VALUE=\"%sM%s\" %s>%s\n", + url, hrdn, i==1 ? "SELECTED" : "", i == cnt - 1 ? + ldap_friendly_name( glob->friendlyfile, s[i], &fm ) :s[i]); + hrdn[0] = '\0'; + } + fprintf( fp, "</SELECT></FORM>\n"); + + ldap_value_free(s); + ldap_value_free(t); +} +/* end of function: make_header_pull_down */ + +PUBLIC char * url_complete (gwp_url, rdn, separator) +char *gwp_url, *rdn, *separator; +{ + static char url[BUFSIZ]; + char *strptr; + + strcpy(url, gwp_url); + + if(!strchr (gwp_url, '=')) { + + if (!strncasecmp (url, "http://", 7)) { + + if ( ( strptr = strchr (url+7, '/')) ) *(++strptr) = '\0'; + else strcat (url, "/"); + + } else *url = '\0'; + + sprintf (url, "%s%s%s", url, separator, rdn); + + } + + return(url); + +} +/* end of function: url_complete */ + +PRIVATE void photof(fp, flag, imageChar, dn, tattr) +FILE *fp; +int flag; +char imageChar; +char *dn; +char *tattr; +{ + switch(flag) { + case BMP : imageChar = 'G'; break; + case JPEG2GIF: imageChar = 'I'; break; + case JPEG : imageChar = 'J'; break; + } + fprintf( fp, "<IMG ALT=\"Photo\" SRC=\"%c%s\"+%s>\n", + imageChar, hex_encode(dn), tattr); +} +/* end of function: photof */ + +PRIVATE void urlf(fp, vali) +FILE *fp; +char *vali; +{ + char *cp; + + if ((cp = strchr(vali, '$')) != NULL) { + *cp++ = '\0'; + fprintf( fp, "%s%c\n", vali, + (vali[0] ? ':' : ' ')); + fprintf(fp," <A HREF=\"%s\"> %s</A><BR>\n", + cp, cp); + } else + fprintf( fp, "%s<BR>\n", vali); +} +/* end of function: urlf */ + +PRIVATE void dynamicdnf(fp, vali, glob) +FILE *fp; +char *vali; +GLOB_STRUCT *glob; +{ + fprintf(fp," <A HREF=\"%s/M%s\"> %s</A><BR>\n", + +#ifdef TUE_TEL + dn2server(vali, glob), +#else + "", +#endif + + vali, vali); +} +/* end of function: dynamicdnf */ + +/* Allow href dn-lable flexible configuration via INDEXURL */ +PRIVATE void indexurlf(fp, vali, entrydn, glob) +FILE *fp; +char *vali; +char *entrydn; +GLOB_STRUCT *glob; +{ + char *cp; + char dnbuf[BUFSIZ], *strptr, **dn; + char rulebuf[BUFSIZ], *disp_item; + int arrsize, first; + char entrydnbuf[BUFSIZ], dit_dnbuf[BUFSIZ]; + int index; + + if (((cp = strchr(vali, ' ')) != NULL) && glob->index_url) { + + *cp++ = '\0'; + index = atoi(cp); + + if ( index < 0 || index >= INDEX_RULE_SIZE ) + return; + if (!glob->index_url->rarr[index].rule) { + return; + } + + /* case entrydn out of range */ + strcpy(entrydnbuf, entrydn); + strcpy(dit_dnbuf, glob->index_url->rarr[index].dit_dn); + dn_normalize(entrydnbuf); + dn_normalize(dit_dnbuf); + if(!dn_issuffix(entrydnbuf, dit_dnbuf)){ + fprintf(fp," <A HREF=\"%s\"> %s</A><BR>\n", vali, cp); + return; + } + + /* return if url doesn't contain cn= ( no dn ) */ + if(!(strptr = strstr(vali, "cn="))) + return; + strcpy(dnbuf, strptr); + hex_decode(dnbuf); + dn = ldap_explode_dn(dnbuf, 1); + + for(arrsize=0; dn[arrsize]; arrsize++) + ; + + if(arrsize && glob->strip_pin) + trimright(dn[0], " 1234567890"); + + fprintf(fp," <A HREF=\"%s\">", vali); + strcpy(rulebuf, glob->index_url->rarr[index].rule); + first = 1; + + for(disp_item = strtok(rulebuf, ","); disp_item; + disp_item = strtok(NULL, ",")) { + if(abs(atoi(disp_item)) >= arrsize) continue; + + if(*disp_item == '-') { + fprintf(fp,"%s%s", !first ? ", " : "", + dn[arrsize + atoi(disp_item) - 1]); + } else { + fprintf(fp,"%s%s", !first ? ", " : "", dn[atoi(disp_item)]); + } + first = 0; + } + + fprintf(fp,"</A><BR>\n"); + } else + fprintf( fp, "%s<BR>\n", vali); +} +/* end of function: indexurlf */ + +PRIVATE void urif(fp, vali, glob) +FILE *fp; +char *vali; +GLOB_STRUCT *glob; +{ + char *cp; + + if(glob->gw_switch->dynamic && strstr(vali, "(gw")) + return; + if ((cp = strchr(vali, ' ')) != NULL) { + *cp++ = '\0'; + fprintf(fp," <A HREF=\"%s\"> %s</A><BR>\n", vali, cp); + } else + fprintf( fp, "%s<BR>\n", vali); +} +/* end of function: urif */ + +/* function for ldap-referrals etc. */ +PRIVATE void referralf(fp, vali, glob) +FILE *fp; +char *vali; +GLOB_STRUCT *glob; +{ + char *cp; + + if(glob->gw_switch->dynamic && strstr(vali, "(gw")) + return; + if ((cp = strchr(vali, ' ')) != NULL) { + *cp++ = '\0'; + fprintf(fp," <A HREF=\"http://%s:%d/W%s\"> %s</A><BR>\n", + glob->hostname, glob->webport, vali, cp); + } else + fprintf(fp," <A HREF=\"http://%s:%d/W%s\"> %s</A><BR>\n", + glob->hostname, glob->webport, vali, vali); +} +/* end of function: referralf */ + +PRIVATE void pgpkeyf(fp, vali, firstline) +FILE *fp; +char *vali; +int *firstline; +{ + char *s, *p; + + fprintf( fp, "<TT>\n"); + p = s = vali; + while ( ( s = strstr( s, " $" )) ) { + *s++ = '\0'; /* delete BLANK */ + *s++ = '\0'; /* delete DOLLAR */ + while ( isspace( *s ) ) + s++; + if ( *firstline == TRUE ) { + fprintf( fp, "<DT>%s<BR>\n", p ); + *firstline = FALSE; + } else if (!strncasecmp(p, "Version", 7)) { + fprintf( fp, "%s<BR><BR>\n", p ); + } else { + fprintf( fp, "%s<BR>\n", p ); + } + p = s; + } + if ( *firstline == TRUE ) { + fprintf( fp,"<DT>%s<BR>", p ); + *firstline = FALSE; + } else { + fprintf( fp, "%s\n", p ); + } + fprintf( fp, "</TT>\n"); +} +/* end of function: pgpkeyf */ + +PRIVATE void multilinef(fp, vali, first_of_same, firstline, gotone, nlabel) +FILE *fp; +char *vali; +int *first_of_same; +int *firstline; +int *gotone; +char *nlabel; +{ + char *s, *p; + + if ( !*first_of_same && *gotone) + fprintf( fp, "<BR>"); + if ( *gotone && *first_of_same) + fprintf( fp, "<DT><B>%s</B><DD>", nlabel); + else if (!*first_of_same) + fprintf( fp, "<BR>"); + p = s = vali; + + /* PATCH to process MULTILINE correctly: + replace strstr() instead of strchr(), in order not to missinterpret + DOLLAR in Text ; /KSp, 95/06/28 + */ + + /* + while ( s = strchr( s, '$' ) ) { + */ + while ( ( s = strstr( s, " $" )) ) { + *s++ = '\0'; /* delete BLANK */ + *s++ = '\0'; /* delete DOLLAR */ + while ( isspace( *s ) ) + s++; + + /* + if (dosyslog) + syslog (LOG_INFO, "multiLineAttr: %s", p); + */ + + fprintf( fp, "%s<BR>\n", p ); + if ( *firstline == TRUE ) + *firstline = FALSE; + p = s; + } + if ( *firstline ) { + fprintf( fp, "%s<BR>\n", p ); + } else { + fprintf( fp, "%s", p ); + } + *gotone = 1; + *firstline = FALSE; + *first_of_same = FALSE; +} +/* end of function: multilinef */ + +PRIVATE void booleanf(fp, val_i, glob) +FILE *fp; +char *val_i; +GLOB_STRUCT *glob; +{ + if (!strcmp(val_i, "TRUE")) fprintf( fp, "%s<BR>\n", glob->la[78]); + else fprintf( fp, "%s<BR>\n", glob->la[79]); +} +/* end of function: booleanf */ + +PRIVATE void datef(fp, val_i) +FILE *fp; +char **val_i; +{ + fprintf( fp, "%s<BR>\n", format_date(&val_i, "%A, %d-%h-%y %T GMT")); +} +/* end of function: datef */ + +PRIVATE void mailtof(fp, val_i, vali) +FILE *fp; +char *val_i; +char *vali; +{ + fprintf (fp, "<A HREF=\"mailto:%s\">%s</A><BR>\n", val_i, vali); +} +/* end of function: mailtof */ + +PRIVATE void hreff(fp, val_i, vali, glob) +FILE *fp; +char *val_i; +char *vali; +GLOB_STRUCT *glob; +{ + char *ufn; + char op = 'R'; + + ufn = friendly_dn( val_i, glob ); + fprintf( fp, "<A HREF=\"/%c%s\">%s</A><BR>\n", op, + hex_encode(val_i), ufn ? ufn : vali); + if ( ufn ) { + free( ufn ); + } +} +/* end of function: hreff */ + +PRIVATE void movetof(fp, val_i, vali, glob) +FILE *fp; +char *val_i; +char *vali; +GLOB_STRUCT *glob; +{ + char *ufn; + char op = 'M'; + + ufn = friendly_dn( val_i, glob ); + fprintf( fp, "<A HREF=\"/%c%s\">%s</A><BR>\n", op, + hex_encode(val_i), ufn ? ufn : vali); + if ( ufn ) { + free( ufn ); + } +} +/* end of function: movetof */ + + +PRIVATE void headerf(fp, vali, firstline) +FILE *fp; +char *vali; +int *firstline; +{ + fprintf( fp, "<DT>"); + fprintf( fp, "<H1>"); + fprintf( fp,"%s", vali ); + fprintf( fp, "</H1>\n"); +} +/* end of function: headerf */ + +PRIVATE void pref(fp, vali, firstline) +FILE *fp; +char *vali; +int *firstline; +{ + fprintf( fp, "<DT>"); + fprintf( fp, "<PRE>"); + fprintf( fp,"%s", vali ); + fprintf( fp, "</PRE>\n"); +} +/* end of function: pref */ + +PRIVATE void defaultf(fp, vali, firstline) +FILE *fp; +char *vali; +int *firstline; +{ + if ( *firstline == TRUE ) { + fprintf( fp,"%s", vali ); + *firstline = FALSE; + } else { + fprintf( fp, "<BR>\n%s", vali ); + } +} +/* end of function: defaultf */ + diff --git a/contrib/tweb/html.h b/contrib/tweb/html.h new file mode 100644 index 0000000000000000000000000000000000000000..a749e4ff863f8d61ffbb115a4eb1138383045eba --- /dev/null +++ b/contrib/tweb/html.h @@ -0,0 +1,50 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* html.h..... * +* * +* Function:..File for TWEB-SOFTWARE * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* April 19 1996 Z D D V V * +* Last modification: Z D D V V * +* May 14 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: html.h,v 1.6 1999/09/10 15:01:17 zrnsk01 Exp $ + * + */ + +#ifndef _HTML_ +#define _HTML_ + +#include "html_exp.h" +#include "dn_exp.h" + +PRIVATE void photof(); +PRIVATE void urlf(); +PRIVATE void urif(); +PRIVATE void referralf(); +PRIVATE void dynamicdnf(); +PRIVATE void indexurlf(); +PRIVATE void pgpkeyf(); +PRIVATE void multilinef(); +PRIVATE void booleanf(); +PRIVATE void datef(); +PRIVATE void mailtof(); +PRIVATE void hreff(); +PRIVATE void movetof(); +PRIVATE void pref(); +PRIVATE void headerf(); +PRIVATE void defaultf(); +PRIVATE void make_header_pull_down(); + +#endif /* _HTML_ */ diff --git a/contrib/tweb/html_exp.h b/contrib/tweb/html_exp.h new file mode 100644 index 0000000000000000000000000000000000000000..815c423f72d17990802adc32f57a1cac725d9f99 --- /dev/null +++ b/contrib/tweb/html_exp.h @@ -0,0 +1,41 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* html_exp.h. * +* * +* Function:..File for TWEB-SOFTWARE * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* February 13 1996 Z D D V V * +* Last modification: Z D D V V * +* November 21 1996 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: html_exp.h,v 1.6 1999/09/10 15:01:17 zrnsk01 Exp $ + * + */ + +#ifndef _HTML_EXP_ +#define _HTML_EXP_ + +PUBLIC void print_attr(/*ld, fp, dn, label, tattr, e, flag, doNotShow, glob*/); +PUBLIC void form_attr(/*ld, fp, label, tattr, e, multiline, add_empty, glob*/); +PUBLIC void do_pict(/*ld, fp, dn, type, glob*/); +PUBLIC void do_audio(/*ld, fp, dn, type, glob*/); +PUBLIC void do_sizelimit(/*fp, type, glob*/); +PUBLIC void do_error(/*fp, code, status, glob*/); +PUBLIC void explain_error (/*fp, error, status, glob */); +PUBLIC void make_header (/*fp, dn, action, glob*/); +PUBLIC char * url_complete (/*gwp_url, rdn, separator*/); + + + +#endif /* _HTML_EXP_ */ diff --git a/contrib/tweb/init.c b/contrib/tweb/init.c new file mode 100644 index 0000000000000000000000000000000000000000..667114f4d9f5a970ed3df820988165bd43aaaff6 --- /dev/null +++ b/contrib/tweb/init.c @@ -0,0 +1,1858 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* init.c..... * +* * +* Function:..Initialisation-Routine for TWEB * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* July 21 1995 Z D D V V * +* Last modification: Z D D V V * +* May 11 1999 ZZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: init.c,v 1.6 1999/09/10 15:01:17 zrnsk01 Exp $ + * + */ + +#include "tgeneral.h" +#include "tglobal.h" +#include "init.h" + + +PUBLIC void getopts (argc, argv, glob) +int argc; +char **argv; +GLOB_STRUCT *glob; +{ + int i; + extern char *optarg; + char hname[BUFSIZ]; + struct hostent *hstruct; + + while ( (i = getopt( argc, argv, "P:ad:f:l:p:x:b:L:" )) != EOF ) { + switch( i ) { + case 'a': + searchaliases = 0; + break; + case 'b': + if(glob->basedn && glob->basedn->dn) + free(glob->basedn->dn); + glob->basedn->dn = strdup( optarg ); + break; + case 'd': + debug = atoi( optarg ); +#ifdef LDAP_DEBUG + ldap_debug = debug; +#else + fprintf( stderr, + "warning: ldap debugging requires LDAP_DEBUG\n" ); +#endif + break; + + case 'f': + glob->filterfile = strdup( optarg ); + break; + + case 'l': + dosyslog = cnvt_str2int( optarg, syslog_types, LOG_LOCAL3 ); + break; + + case 'p': + glob->webport = atoi( optarg ); + break; + + case 'P': + glob->ldapport = atoi( optarg ); + break; + + case 'x': + if(glob->ldapd) + free(glob->ldapd); + glob->ldapd = str_tolower( strdup( optarg )); + break; + case 'L': + break; + default: + usage(argv[0]); + } + } + if ( (glob->myname = strrchr( argv[0], '/' )) == NULL ) + glob->myname = argv[0]; + else + glob->myname++; + + if(!glob->hostname) { + gethostname(hname, BUFSIZ); + hstruct = gethostbyname(hname); + glob->hostname = str_tolower( strdup( hstruct->h_name )); + } + +} +/* end of function: getopts */ + +PRIVATE void usage(name) +char *name; +{ + fprintf(stderr, USAGE, name); + exit( 1 ); +} +/* end of function: usage */ + +PUBLIC void check (glob) +GLOB_STRUCT *glob; +{ + if(!glob->webport || !glob->ldapd || !glob->ldapport || + !glob->basedn || !glob->sort) { + fprintf(stderr, +"\nMissing must-attribute: webport || ldapd || ldapport || basedn->dn || sort\n!\n\n"); + exit(1); + } + + if(glob->grant){ + trim(glob->grant, "|"); + glob->comp_grant = tweb_regcomp(glob->grant); + } + + if(glob->refuse){ + trim(glob->refuse, "|"); + glob->comp_refuse = tweb_regcomp(glob->refuse); + } + + if(glob->allow_string){ + trim(glob->allow_string, "|"); + glob->comp_allow = tweb_regcomp(glob->allow_string); + } + + if(glob->deny_string){ + trim(glob->deny_string, "|"); + glob->comp_deny = tweb_regcomp(glob->deny_string); + } + + if(!glob->webdn){ + glob->webdn = "c=DE"; + if(glob->webpw) free(glob->webpw); + glob->webpw = NULL; + } + if(!glob->webdn2){ + glob->webdn2 = "c=BR"; + if(glob->webpw2) free(glob->webpw2); + glob->webpw2 = NULL; + } + + if(!glob->timeout) + glob->timeout = DEFAULT_TIMEOUT; + if(!glob->maxcount) + glob->maxcount = DEFAULT_MAXCOUNT; + + if(!glob->subtree_search) + glob->subtree_search = + str2charray( "organization:organizationalUnit", ":"); + + glob->cache_expire = glob->cache_expire % MAX_EXPIRE; + + f_test(glob); + if(glob->sort) { + pSORT_LINE s_ptr; + pDISPLAY d_ptr; + + for(s_ptr = glob->sort; s_ptr; s_ptr = s_ptr->next) + for(d_ptr = glob->display; d_ptr; d_ptr = d_ptr->next) { + if(!strcmp(d_ptr->ocs, s_ptr->display_class)) { + s_ptr->display_class_ptr = d_ptr; + break; + } + if(!strcmp(d_ptr->ocs, "default")) + s_ptr->display_class_ptr = d_ptr; + } + } + + if( glob->ldapd && !strcmp(glob->ldapd, "x500-relay.uni-tuebingen.de") + && !strcmp(glob->lang, "0")) { + fprintf( stderr, + "\n\n\tYou missed to set LDAP-HOST and LDAP-PORT to\n\ + a machine of your own.\n\n\tPlease change as soon as \ + possible to avoid\n\ + overload of host x500-relay.uni-tuebingen.de !\n\n"); + } + +} +/* end of function: check */ + +PUBLIC void init(argv, lang, glob) +char **argv; +char *lang; +GLOB_STRUCT *glob; +{ +FILE *fp; +static char file[BUFSIZ]; + + glob->argv0 = strdup(argv[0]); + glob->gw_switch = (pGW_SWITCH) ch_calloc(1, sizeof(GW_SWITCH)); + glob->basedn = (BASEDN_LINE *) ch_calloc(1, sizeof(BASEDN_LINE)); + glob->basedn->dn = strdup(""); + glob->menu_filter = strdup("(& (objectClass=top)(!(objectClass=dSA)) )"); + +#ifdef RCINIT + strcpy(file, RCINIT); +#else + sprintf( file, "%s.rc", argv[0] ); +#endif + glob->acfilename = file; + if(!(fp = fopen(file, "r"))) { + fprintf(stderr, "\n\nATTENTION!!!\n\nCould not open file %s !\n", file); + exit(1); + } + main_loop(fp, glob); + fclose(fp); + +#ifdef CONFINIT + strcpy(file, CONFINIT); +#else + sprintf( file, "%s.conf.%s", argv[0], glob->lang ); +#endif + glob->acfilename = file; + if(!(fp = fopen(file, "r"))) { + fprintf(stderr, "\n\nATTENTION!!!\n\nCould not open file %s !\n", file); + exit(1); + } + main_loop(fp, glob); + fclose(fp); + return; +} +/* end of function: init */ + +#define STRINGP(x) ((x) ? (x) : "(NULL)") + +PUBLIC void output(fp, glob, html_flag) +FILE *fp; +GLOB_STRUCT *glob; +int html_flag; +{ + pDISPLAY d_ptr; + pSEARCH_ONLY_LINE so_ptr; + pGW_SWITCH_LINE gw_ptr; + pSORT_LINE s_ptr; + pDISPLAY_LINE dis_ptr; + pMODIFY_LINE mod_ptr; + pMODIF m_ptr; + pCACHING_TERMS_LINE ca_ptr; + pIND_ATTRS i_ptr; + IND_ATTR_ARR *idx; + pTABLE_DISPLAY ta_ptr; + pFORM_BUTTON fo_ptr; + int i; + char hb[BUFSIZ], he[BUFSIZ], li[BUFSIZ], lb[BUFSIZ], le[BUFSIZ]; + + strcpy(lb, html_flag ? "<UL>" : ""); + strcpy(le, html_flag ? "</UL>" : ""); + strcpy(li, html_flag ? "<LI>" : ""); + strcpy(hb, html_flag ? "</UL><B>" : ""); + strcpy(he, html_flag ? "</B><UL>" : ""); + +/*for(i=0; glob->sort_attribs[i]; i++) + fprintf(fp,"%s<p>\n", glob->sort_attribs[i]); +*/ + + fprintf(fp, + "%s\n\n\n###############CONFIGURATION-DISPLAY###############\n\n%s", + html_flag ? "<B>" : "", he); + fprintf(fp, "\n%s\n\n%s", version, html_flag ? "<p>" : ""); +/* fprintf(fp, "%s\n%s\n\n%s", html_flag ? "<B>" : "", version, he); +*/ + + fprintf(fp, "%sWEBDN%s%s %s\n", hb, he, li, STRINGP( glob->webdn )); + fprintf(fp, "%sWEBDN2%s%s %s\n", hb, he, li, STRINGP( glob->webdn2 )); + if(!html_flag){ + fprintf(fp, "WEBPW: %s\n", STRINGP( glob->webpw )); + fprintf(fp, "WEBPW2: %s\n", STRINGP( glob->webpw2 )); + } + fprintf(fp, "%sTWEBHOST%s%s %s:%d\n", hb, he, li, STRINGP( glob->hostname ), + glob->virtualport ? glob->virtualport : glob->webport); + fprintf(fp, "%sWEBPORT%s%s %d\n", hb, he, li, glob->webport); + fprintf(fp, "%sTIMEOUT%s%s %d\n", hb, he, li, glob->timeout); + fprintf(fp, "%sLDAPD%s%s %s\n", hb, he, li, STRINGP( glob->ldapd )); + fprintf(fp, "%sLDAPPORT%s%s %d\n\n", hb, he, li, glob->ldapport); + fprintf(fp, "%sETCDIR%s%s %s\n", hb, he, li, STRINGP( glob->etcdir )); + fprintf(fp, "%sHELPFILE%s%s %s\n", hb, he, li, STRINGP( glob->helpfile )); + fprintf(fp, "%sFILTERFILE%s%s %s\n", hb, he, li, + STRINGP( glob->filterfile )); + fprintf(fp, "%sFRIENDLYFILE%s%s %s\n", hb, he, li, + STRINGP( glob->friendlyfile )); + fprintf(fp, "%sHEADER%s%s %s\n", hb, he, li, STRINGP( glob->header )); + fprintf(fp, "%sFOOTER%s%s %s\n", hb, he, li, STRINGP( glob->footer )); + fprintf(fp, "%sGRANT%s%s %s\n", hb, he, li, STRINGP( glob->grant )); + fprintf(fp, "%sREFUSE%s%s %s\n", hb, he, li, STRINGP( glob->refuse )); + + fprintf(fp, "%s\nPULL-DOWN-MENUS%s%s %s\n", + hb, he, li, glob->pull_down_menus?"YES":"NO"); + fprintf(fp, "%s\nDISP-SEA-RDN%s%s %s\n", + hb, he, li, glob->disp_sea_rdn?"YES":"NO"); + fprintf(fp, "%s\nNO-PROXY%s%s %s\n", hb, he, li, glob->no_proxy?"YES":"NO"); + fprintf(fp, "%s\nALLOW-PROXY%s\n%s", hb, he, li); + for(i = 0; glob->allow_proxy && glob->allow_proxy[i]; i++) + fprintf(fp, "%s:", glob->allow_proxy[i]); + + fprintf(fp, "%sALLOW-STRING%s%s %s\n", hb, he, li, + STRINGP( glob->allow_string )); + fprintf(fp, "%sDENY-STRING%s%s %s\n", hb, he, li, + STRINGP( glob->deny_string )); + fprintf(fp, "%sALLOW-MSG%s%s %s\n", hb, he, li, STRINGP( glob->allow_msg )); + fprintf(fp, "%s\nBASEDN%s%s \t%s\t%s\t%s\n", hb, he, li, + STRINGP( glob->basedn->dn ), STRINGP( glob->basedn->head ), + STRINGP( glob->basedn->foot )); +/* fprintf(fp, "%s\nBASEDNARRAY%s%s \t%s\t%s\n", hb, he, li, glob->basedn->dnarray[0], glob->basedn->dnarray[1]); */ + fprintf(fp, "%s\nMAXCOUNT%s%s %d\n", hb, he, li, glob->maxcount); + if (glob->comrefuse) + fprintf(fp, "%s\nCOMREFUSE%s%s %d\t%d\t%d\t%d\t%lu\t%s\n", + hb, he, li, glob->comrefuse->tmin, glob->comrefuse->tdiff, + glob->comrefuse->maxAccept, glob->comrefuse->suspendCycle, + glob->comrefuse->statCycle, + STRINGP( glob->comrefuse->statFile )); + fprintf(fp, "%s\nMAX-PERSON%s%s %d\t%s\t%s\n", hb, he, li, + glob->max_person, glob->strict?"STRICT":"", + glob->no_browse?"NO-BROWSE":""); + fprintf(fp, "%s\nLEGAL%s%s %s %s\n", hb, he, li, glob->legal?"YES":"NO", + glob->legal_top ? "ON-TOP" : ""); +/* fprintf(fp, "%s\nSHOW-DEFOC%s%s %s\n", hb, he, li, glob->show_defoc?"YES":"NO"); +*/ + +#ifdef AMBIXGW + fprintf(fp, "%s\nSELBSTEINTRAG%s\n", hb, he); + for(i = 0; i<9; i++) + if (glob->selbsteintrag[i]) + fprintf(fp, "%s\t%s\n", li, glob->selbsteintrag[i]); +#endif + + fprintf(fp, "%s\nSTRIP-PIN%s%s %s\n", hb, he, li, + STRINGP( glob->strip_pin )); + fprintf(fp, "%s\nPREFER-REF-URIS%s%s %s\n", hb, he, li, + glob->prefer_ref_uris?"YES":"NO"); + fprintf(fp, "%s\nSTRICT-BASEDN%s%s %s\n", hb, he, li, + glob->strict_basedn?"YES":"NO"); + fprintf(fp, "%s\nNO-SHOW-RDN%s%s %s\n\n", hb, he, li, + STRINGP( glob->no_show_rdn )); + fprintf(fp, "%s\nNO-MODIFY%s%s %s\n\n", hb, he, li, + STRINGP( glob->no_modify )); + +#ifdef TUE_TEL + fprintf(fp, "%sPHONEWORLD%s%s %s\n", hb, he, li, + STRINGP( glob->phoneworld )); +#endif + + fprintf(fp, "%s\nLANGUAGE%s\n", hb, he); + for(i = 0; glob->language[i]; i++) + fprintf(fp, "%s\t%s\n", li, glob->language[i]); + + fprintf(fp, "%s\nCACHE-EXPIRE-DEFAULT%s%s %d\n", hb, he, li, + glob->cache_expire); + fprintf(fp, "%s\nCACHING-TERMS%s\n", hb, he); + for(ca_ptr = glob->caching_terms; ca_ptr; ca_ptr = ca_ptr->next) { + fprintf(fp, "%s\t%d\t%s\t%s\t%s\n", li, ca_ptr->time, + STRINGP( ca_ptr->access_type ), ca_ptr->rdn_oc ? "RDN" : "OC", + STRINGP( ca_ptr->pattern )); + } + +#ifdef TUE_TEL + if(glob->ton_urls) { + fprintf(fp, "%s\nTON-URLS%s\n", hb, he); + fprintf(fp, "%s\t%s\t%s\t%s\t%s\t%s\t%s\n",li, + STRINGP( glob->ton_urls->attribute ), + STRINGP( glob->ton_urls->rdn_attr ), + STRINGP( glob->ton_urls->redirect ), + STRINGP( glob->ton_urls->x_disp ), + STRINGP( glob->ton_urls->base ), + glob->ton_urls->admin?"ADMIN": + glob->ton_urls->pass_oc? glob->ton_urls->pass_oc : ""); + } +#endif + if(glob->ip_refuse) { + fprintf(fp, "%s\nIP-REFUSE%s\n", hb, he); + fprintf(fp, "%s\t%s\t%d\n",li, + STRINGP( glob->ip_refuse->dat_file ), glob->ip_refuse->rereadcycle); + } + + fprintf(fp, "%s\nSEARCH-ONLY%s\n", hb, he); + for(so_ptr = glob->search_only; so_ptr; so_ptr = so_ptr->next) { + fprintf(fp, "%s\t%s\t%s\t%s\n", li, STRINGP( so_ptr->dn ), + STRINGP( so_ptr->head ), STRINGP( so_ptr->foot )); + } + + fprintf(fp, "%s\nSUBTREE-SEARCH%s\n%s", hb, he, li); + for(i = 0; glob->subtree_search && glob->subtree_search[i]; i++) + fprintf(fp, "%s:", glob->subtree_search[i]); + + if(glob->index_url) { + fprintf(fp, "%s\nINDEX-URL%s\n", hb, he); + fprintf(fp, "%s\t%s\t%d\n", li, STRINGP( glob->index_url->dat_file ), + glob->index_url->rereadcycle ); + } + +#ifdef TUE_TEL + if(glob->dit_config) { + fprintf(fp, "%s\nDIT-CONFIG%s\n", hb, he); + fprintf(fp, "%s\t%s\t%s\t%s\n", li, STRINGP( glob->dit_config->attr ), + STRINGP( glob->dit_config->fetch_dn ), + glob->dit_config->not_browse ? "NOT-BROWSE" : ""); + } +#endif + + fprintf(fp, "%s\nDYNAMIC-GW%s%s %s\n", hb, he, li, + glob->gw_switch->dynamic?"YES":"NO"); + fprintf(fp, "%s\nGW-SWITCH%s\n", hb, he); + for(gw_ptr = glob->gw_switch->list; gw_ptr; gw_ptr = gw_ptr->next) { + fprintf(fp, "%s\t%s\t%s\n", li, STRINGP( gw_ptr->dn ), + STRINGP( gw_ptr->url )); + } + + fprintf(fp, "%s\nSORT%s\n", hb, he); + for(s_ptr = glob->sort; s_ptr; s_ptr = s_ptr->next) { + fprintf(fp, "%s\t%s\t%s\t%d\t%s\t%s\n", li, + STRINGP( s_ptr->object_class ), + STRINGP( s_ptr->label ), s_ptr->priority, + STRINGP( s_ptr->display_class ), STRINGP( s_ptr->sort_attr )); + } + + fprintf(fp, "%s\nTABLES%s\n", hb, he); + for(ta_ptr = glob->tables; ta_ptr; ta_ptr = ta_ptr->next) { + fprintf(fp, "%s\t%s\t%s\t%s\t%s\n", li, ta_ptr->allow ? "ALLOW" : "ALL", + STRINGP( ta_ptr->select_oc ), STRINGP( ta_ptr->button_label ), + STRINGP( ta_ptr->dn_extension )); + } + + fprintf(fp, "%s\nFORM-BUTTON%s\n", hb, he); + for(fo_ptr = glob->form_button; fo_ptr; fo_ptr = fo_ptr->next) { + fprintf(fp, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", li, + fo_ptr->read_menu ? "READ" : "MENU", + STRINGP( fo_ptr->object_class ), STRINGP( fo_ptr->method ), + STRINGP( fo_ptr->script_url ), STRINGP( fo_ptr->text ), + STRINGP( fo_ptr->dn_name ), STRINGP( fo_ptr->form_name ), + STRINGP( fo_ptr->button_label )); + } + + fprintf(fp, "%s\nINDIRECT-ATTRS%s", hb, he); + for(i_ptr = glob->ind_attrs; i_ptr; i_ptr = i_ptr->next) { + fprintf(fp, "%s %s\n%s", li, STRINGP( i_ptr->ref_attr ), lb ); + for(idx = i_ptr->ia_arr, i=0; idx[i].key; i++) + fprintf(fp, "%s\t%s\t%s\t%s\t%s\t%d\t%s\n", li, idx[i].key, + idx[i].replace == 2 ? "FUNCTION" : idx[i].replace ? "REPLACE" : + "APPEND", STRINGP( idx[i].attr ), STRINGP( idx[i].host ), + idx[i].port, STRINGP( idx[i].base )); + fprintf(fp, le); + } + fprintf(fp, le); + + fprintf(fp, "%s\nMODIFY%s", hb, he); + for(m_ptr = glob->modify; m_ptr; m_ptr = m_ptr->next) { + fprintf(fp, "%s %s\n%s", li, STRINGP( m_ptr->ocs ), lb ); + for(mod_ptr = m_ptr->modattr; mod_ptr; mod_ptr = mod_ptr->next) + fprintf(fp, "%s\t%s\t%s\t%d\n", li, STRINGP( mod_ptr->attribute ), + STRINGP( mod_ptr->label ), mod_ptr->count); + } + fprintf(fp, le); + + fprintf(fp, "%s\nDISPLAY-OBJECT%s", hb, he); + for(d_ptr = glob->display; d_ptr; d_ptr = d_ptr->next) { + fprintf(fp, "%s\n\n %s\n%s", li, STRINGP( d_ptr->ocs) , lb ); + fprintf(fp, "%sFIRST-PAGE:\n%s", li, lb); + for(dis_ptr = d_ptr->first_page; dis_ptr; dis_ptr = dis_ptr->next) + fprintf(fp, "%s\t%s\t%s\t%s\n", li, STRINGP( dis_ptr->attribute ), + STRINGP( dis_ptr->label ), STRINGP( dis_ptr->type )); + fprintf(fp, "%s%sSECOND-PAGE:\n%s", le, li, lb); + for(dis_ptr = d_ptr->second_page; dis_ptr; dis_ptr = dis_ptr->next) + fprintf(fp, "%s\t%s\t%s\t%s\n", li, STRINGP( dis_ptr->attribute ), + STRINGP( dis_ptr->label ), STRINGP( dis_ptr->type )); + fprintf(fp, "%s%s", le, le); + } + fprintf(fp, le); +} +/* end of function: output */ + +PRIVATE void main_loop(fp,glob) +FILE *fp; +GLOB_STRUCT *glob; +{ +FILELINE inLine; +extern PARSE_ENTRY parse_table[]; + + while(do_readf(&inLine, fp)){ + parse(&inLine, parse_table, glob, 0); + } +} +/* end of function: main_loop */ + +PUBLIC int do_readf(inLine, fp) +FILE *fp; +FILELINE *inLine; +{ +static FILE *fo; +static int lineCount = 0; + + if(fp) + fo = fp; + + do { + char *comment; + + if(!fgets(inLine->value, BUFSIZ-1, fo)){ + lineCount = 0; + return(0); + } + lineCount++; + if( (comment = strchr(inLine->value, '#')) ) + *comment = '\0'; + trim(inLine->value, " \t\n"); + } while(!*inLine->value); + + inLine->count = lineCount; +/* printf("%d: %s\n", inLine->count, inLine->value); +*/ + return (inLine->count); +} +/* end of function: do_readf */ + +PRIVATE int parse(inLine, p_table, glob, level) +FILELINE *inLine; +PARSE_ENTRY *p_table; +GLOB_STRUCT *glob; +int level; +{ +int lineCount = inLine->count; + + while(1){ + switch(parse2(inLine, p_table, glob, level)){ + case NOTOK: + printf("Error in init-file line %d:\n%s\n ", inLine->count, inLine->value); + exit(1); + case DONE: + if(lineCount == inLine->count) + return (DONE); + else + lineCount = inLine->count; + break; + default: + return (OK); + } + } +} +/* end of function: parse */ + +PRIVATE int parse2(inLine, p_table, glob, level) +FILELINE *inLine; +PARSE_ENTRY *p_table; +GLOB_STRUCT *glob; +int level; +{ +PARSE_ENTRY *disp; +char keyWord[BUFSIZ]; + + sscanf(inLine->value, "%s", keyWord); + str_toupper( keyWord ); + for(disp=p_table; disp->keyWord; disp++) { + if(!strcmp(keyWord, disp->keyWord)){ + return ((*disp->keyFunc)(inLine, disp, glob, level)); + } + } + return (level?DONE:NOTOK); +} +/* end of function: parse2 */ + +PUBLIC int get_str_param(inLine, str, glob, lower) +FILELINE *inLine; +char **str; +GLOB_STRUCT *glob; +int lower; +{ +char tmp[4*BUFSIZ]; + + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*[^\"]\"%[^\"]", tmp) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + }else + if (sscanf(inLine->value, "%*s%s", tmp) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + do { + if(*str) { + *str = realloc(*str, strlen(*str) + strlen(tmp) +1 ); + strcat(*str, lower ? str_tolower( tmp ) : tmp ); + } else { + *str = strdup( lower ? str_tolower( tmp ) : tmp ); + } + + if(!do_readf(inLine, NULL)) + return (OK); + + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*[^\"]\"%[^\"]", tmp) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + }else + if (sscanf(inLine->value, "%s", tmp) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + } while(inLine->value[0] == ' ' || inLine->value[0] == '\t'); + + return (DONE); +} +/* end of function: get_str_param */ + +PRIVATE int get_int_param(inLine, integer, glob) +FILELINE *inLine; +int *integer; +GLOB_STRUCT *glob; +{ +char tmp[BUFSIZ]; + + if (sscanf(inLine->value, "%*s%s", tmp) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + *integer = atoi(tmp); + return (OK); +} +/* end of function: get_int_param */ + + +PRIVATE int webdn(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->webdn, glob, 0)); +} +/* end of function: webdn */ + +PRIVATE int webpw(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->webpw, glob, 0)); +} +/* end of function: webpw */ + +PRIVATE int webdn2(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->webdn2, glob, 0)); +} +/* end of function: webdn2 */ + +PRIVATE int webpw2(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->webpw2, glob, 0)); +} +/* end of function: webpw2 */ + + +PRIVATE int webport(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_int_param(inLine, &glob->webport, glob)); +} +/* end of function: webport */ + +PRIVATE int timeout(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_int_param(inLine, &glob->timeout, glob)); +} +/* end of function: timeout */ + +PRIVATE int hostname(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char hostname[BUFSIZ]; +char *virtualport; + + if (sscanf(inLine->value, "%*s%s", hostname) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + if( ( virtualport = strchr(hostname, ':')) ) { + *virtualport++ = '\0'; + glob->virtualport = atoi( virtualport ); + } + glob->hostname = strdup( hostname ); + return (OK); +} +/* end of function: hostname */ + +PRIVATE int ldapd(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->ldapd, glob, 1)); +} +/* end of function: ldapd */ + +PRIVATE int ldapportf(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_int_param(inLine, &glob->ldapport, glob)); +} +/* end of function: ldapportf */ + +PRIVATE int etcdir(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->etcdir, glob, 0)); +} +/* end of function: etcdir */ + +PRIVATE int filterfilef(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->filterfile, glob, 0)); +} +/* end of function: filterfile */ + +PRIVATE int helpfilef(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->helpfile, glob, 0)); +} +/* end of function: helpfile */ + +PRIVATE int friendlyfilef(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->friendlyfile, glob, 0)); +} +/* end of function: friendlyfile */ + +PRIVATE int index_url(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + char dat_file[BUFSIZ]; + char rereadcycle[BUFSIZ]; + + if (sscanf(inLine->value, "%*s%s%s", dat_file, rereadcycle) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", + glob->acfilename, inLine->count, inLine->value); + + glob->index_url = (INDEX_URL *) ch_calloc(1, sizeof(INDEX_URL)); + glob->index_url->dat_file = strdup( dat_file ); + glob->index_url->rereadcycle = atoi(rereadcycle); + + get_index_url_rules(glob); + + return (OK); +} /* index_url */ + +PUBLIC void get_index_url_rules(glob) +GLOB_STRUCT *glob; +{ +char index[BUFSIZ]; +char rule[BUFSIZ]; +char dit_dn[BUFSIZ]; +FILE *dfp; +char inLine[BUFSIZ]; +int idx; + + if ( !glob->index_url || !glob->index_url->dat_file ) + return; + if(!(dfp = fopen(glob->index_url->dat_file, "r"))) + return; + + for ( idx = 0; idx < INDEX_RULE_SIZE; idx++ ) { + free( glob->index_url->rarr[idx].rule ); + free( glob->index_url->rarr[idx].dit_dn ); + } + + while(fgets(inLine, BUFSIZ-1, dfp)) { + + if(strchr(inLine, '"')) { + if (sscanf(inLine, "%s%s%*[^\"]\"%[^\"]\"", + index, rule, dit_dn) < 1) + syslog (LOG_INFO, "Error in index_url-file"); + } else { + if (sscanf(inLine, "%s%s%s", + index, rule, dit_dn) < 1) + syslog (LOG_INFO, "Error in index_url-file"); + } + idx = atoi(index); + if ( idx < 0 || idx >= INDEX_RULE_SIZE ) + continue; + glob->index_url->rarr[idx].rule = str_tolower( strdup( rule )); + glob->index_url->rarr[idx].dit_dn = strdup( dit_dn ); + } + fclose( dfp ); +} +/* end of function: get_index_url_rules */ + +PUBLIC void re_read_index_url_rules( glob ) +GLOB_STRUCT *glob; +{ + static int index_url_rules_reload = 0; + + if ( glob->index_url && glob->index_url->rereadcycle && !( ++index_url_rules_reload % glob->index_url->rereadcycle )) { + get_index_url_rules( glob ); + } + +} /* re_read_index_url_rules */ + + +PRIVATE int allow_proxy(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char tmp[BUFSIZ]; + + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*[^\"]\"%[^\"]", tmp) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + }else + if (sscanf(inLine->value, "%*s%s", tmp) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + glob->allow_proxy = str2charray( str_tolower(tmp), ":"); + return (OK); +} +/* end of function: allow_proxy */ + +PRIVATE int subtree_search(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char tmp[BUFSIZ]; + + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*[^\"]\"%[^\"]", tmp) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + }else + if (sscanf(inLine->value, "%*s%s", tmp) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + glob->subtree_search = str2charray( tmp, ":"); + return (OK); +} +/* end of function: subtree_search */ + +PRIVATE int grant(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->grant, glob, 1)); +} +/* end of function: grant */ + +PRIVATE int refuse(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->refuse, glob, 1)); +} +/* end of function: refuse */ + +PRIVATE int allow_string(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->allow_string, glob, 1)); +} +/* end of function: allow_string */ + +PRIVATE int deny_string(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->deny_string, glob, 1)); +} +/* end of function: deny_string */ + + +PRIVATE int show_defoc(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + + glob->show_defoc = 1; + return (OK); +} +/* end of function: show_defoc */ + +PRIVATE int max_person(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char tmp[BUFSIZ]; +char tmp2[BUFSIZ]; +char tmp3[BUFSIZ]; + + if (sscanf(inLine->value, "%*s%s%s%s", tmp, tmp2, tmp3) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + glob->max_person = atoi(tmp); + glob->strict = (!strcasecmp (tmp2, "strict") || !strcasecmp (tmp3, "strict")) ? TRUE : FALSE; + glob->no_browse = (!strcasecmp (tmp2, "no-browse") || !strcasecmp (tmp3, "no-browse")) ? TRUE : FALSE; + + return (OK); +} +/* end of function: max_person */ + +PRIVATE int comrefuse(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + char tmp[BUFSIZ]; + char tmp2[BUFSIZ]; + char tmp3[BUFSIZ]; + char tmp4[BUFSIZ]; + char tmp5[BUFSIZ]; + char tmp6[BUFSIZ]; + + if (sscanf(inLine->value, "%*s%s%s%s%s%s%s", + tmp, tmp2, tmp3, tmp4, tmp5, tmp6) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + comRefuseP = glob->comrefuse = + (COMREFUSE *) ch_calloc(1, sizeof(COMREFUSE)); + glob->comrefuse->tmin = atoi(tmp); + glob->comrefuse->tdiff = atoi(tmp2) - glob->comrefuse->tmin; + glob->comrefuse->maxAccept = atoi(tmp3); + glob->comrefuse->suspendCycle = -1 * atoi(tmp4); + glob->comrefuse->statCycle = (time_t) atol (tmp5); + sprintf (tmp6, "%s.%s-%d", tmp6, glob->lang, (int) getpid()); + glob->comrefuse->statFile = strdup (tmp6); + + return (OK); +} +/* end of function: comrefuse */ + +PRIVATE int display(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char tmp[BUFSIZ]; +pDISPLAY *d_ptr; + + for(d_ptr = &glob->display; *d_ptr; d_ptr = &(*d_ptr)->next) + ; + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*[^\"]\"%[^\"]", tmp) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%*s%s", tmp) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + *d_ptr = (pDISPLAY) ch_calloc(1, sizeof(DISPLAY)); + (*d_ptr)->ocs = str_tolower( strdup( tmp )); + if(strcmp(tmp, "default")) + glob->default_display_type = *d_ptr; + if(!do_readf(inLine, NULL)) + return (OK); + return (parse(inLine,disp->subTable, glob, ++level)); +} +/* end of function: display */ + +PRIVATE int basednf(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char dn[BUFSIZ]; +char head[BUFSIZ]; +char foot[BUFSIZ]; + + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*[^\"]\"%[^\"]\"%s%s", dn, head, foot) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%*s%s%s%s", dn, head, foot) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + if ( !strcasecmp( dn, "ROOT" )) *dn = '\0'; + glob->basedn->dn = strdup( dn ); + glob->basedn->dnarray = dn2charray( dn ); + glob->basedn->head = strdup(head); + glob->basedn->foot = strdup(foot); + return (OK); +} +/* end of function: basednf */ + +PRIVATE int search_only(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char dn[BUFSIZ]; +char head[BUFSIZ]; +char foot[BUFSIZ]; +pSEARCH_ONLY_LINE *so_ptr; + + so_ptr = &glob->search_only; + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*[^\"]\"%[^\"]\"%s%s", dn, head, foot) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%*s%s%s%s", dn, head, foot) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + do { + *so_ptr = (pSEARCH_ONLY_LINE) ch_calloc(1, sizeof(SEARCH_ONLY_LINE)); + (*so_ptr)->dn = str_tolower( strdup( dn )); + (*so_ptr)->head = strdup(head); + (*so_ptr)->foot = strdup(foot); + so_ptr = &(*so_ptr)->next; + if(!do_readf(inLine, NULL)) + return (OK); + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*[^\"]\"%[^\"]\"%s%s", dn, head, foot) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%s%s%s", dn, head, foot) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } while(inLine->value[0] == ' ' || inLine->value[0] == '\t'); + return (DONE); +} +/* end of function: search_only */ + +PRIVATE int dynamic_gw(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + + glob->gw_switch->dynamic = 1; + return (OK); +} +/* end of function: dynamic_gw */ + +PRIVATE int caching_terms(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char time[BUFSIZ]; +char access_type[BUFSIZ]; +char rdn_oc[BUFSIZ]; +char pattern[BUFSIZ]; +pCACHING_TERMS_LINE *ca_ptr; + + ca_ptr = &glob->caching_terms; + + if (sscanf(inLine->value, "%*s%s%s%s%s", + time, access_type, rdn_oc, pattern) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", + glob->acfilename, inLine->count, inLine->value); + do { + *ca_ptr = (pCACHING_TERMS_LINE) ch_calloc(1, sizeof(CACHING_TERMS_LINE)); + (*ca_ptr)->time = atoi(time); + (*ca_ptr)->access_type = str_toupper(strdup(trim (access_type,WSPACE))); + (*ca_ptr)->rdn_oc = !strncasecmp(rdn_oc, "RDN", 3) ? 1 : 0; + (*ca_ptr)->pattern = str_tolower(strdup(trim (pattern, WSPACE))); + ca_ptr = &(*ca_ptr)->next; + if(!do_readf(inLine, NULL)) + return (OK); + if (sscanf(inLine->value, "%s%s%s%s", + time, access_type, rdn_oc, pattern) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", + glob->acfilename, inLine->count, inLine->value); + } while(inLine->value[0] == ' ' || inLine->value[0] == '\t'); + return (DONE); +} +/* end of function: caching_terms */ + +PRIVATE int gw_switch(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char dn[BUFSIZ]; +char url[BUFSIZ]; +pGW_SWITCH_LINE *gw_ptr; + + for(gw_ptr = &glob->gw_switch->list; *gw_ptr; gw_ptr = &(*gw_ptr)->next) + ; + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*[^\"]\"%[^\"]\"%[\40-\177]", dn, url) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%*s%s%[\40-\177]", dn, url) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + do { + *gw_ptr = (pGW_SWITCH_LINE) ch_calloc(1, sizeof(GW_SWITCH_LINE)); + (*gw_ptr)->dn = str_tolower( strdup( dn )); + (*gw_ptr)->url = strdup(trim (url, WSPACE)); + gw_ptr = &(*gw_ptr)->next; + if(!do_readf(inLine, NULL)) + return (OK); + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*[^\"]\"%[^\"]\"%[\40-\177]", dn, url) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%s%[\40-\177]", dn, url) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } while(inLine->value[0] == ' ' || inLine->value[0] == '\t'); + return (DONE); +} +/* end of function: gw_switch */ + +PRIVATE int table_disp(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + char allow[BUFSIZ]; + char select_oc[BUFSIZ]; + char button_label[BUFSIZ]; + char dn_extension[BUFSIZ]; + pTABLE_DISPLAY *ta_ptr; + + for(ta_ptr = &glob->tables; *ta_ptr; ta_ptr = &(*ta_ptr)->next) + ; + if (sscanf(inLine->value, "%*s%s%s%s%s", allow, select_oc, button_label, dn_extension) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + do { + *ta_ptr = (pTABLE_DISPLAY) ch_calloc(1, sizeof(TABLE_DISPLAY)); + (*ta_ptr)->allow = !strcasecmp(allow, "ALLOW") ? 1 : 0; + (*ta_ptr)->select_oc = str_tolower( strdup( select_oc )); + (*ta_ptr)->button_label = strdup( button_label ); + (*ta_ptr)->dn_extension = str_tolower( strdup( dn_extension )); + ta_ptr = &(*ta_ptr)->next; + if(!do_readf(inLine, NULL)) + return (OK); + if (sscanf(inLine->value, "%s%s%s%s", allow, select_oc, button_label, dn_extension) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } while(inLine->value[0] == ' ' || inLine->value[0] == '\t'); + return (DONE); +} +/* end of function: table_disp */ + +PRIVATE int modify(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + char tmp[BUFSIZ]; + pMODIF *m_ptr; + + sprintf (tmp, "|"); + for(m_ptr = &glob->modify; *m_ptr; m_ptr = &(*m_ptr)->next) + ; + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*[^\"]\"%[^\"]", tmp+1) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%*s%s", tmp+1) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + *m_ptr = (pMODIF) ch_calloc(1, sizeof(MODIF)); + strcat (tmp, "|"); + (*m_ptr)->ocs = str_tolower (tr1 (strdup(tmp), ' ', '|')); + + if(!do_readf(inLine, NULL)) return (NOTOK); + return (parse(inLine,disp->subTable, glob, ++level)); +} +/* end of function: modify */ + +PRIVATE int ind_attrs(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + char tmp[BUFSIZ]; + pIND_ATTRS *i_ptr; + + for(i_ptr = &glob->ind_attrs; *i_ptr; i_ptr = &(*i_ptr)->next) + ; + if (sscanf(inLine->value, "%*s%s", tmp) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + *i_ptr = (pIND_ATTRS) ch_calloc(1, sizeof(IND_ATTRS)); + (*i_ptr)->ref_attr = str_tolower(strdup(tmp)); + + if(!do_readf(inLine, NULL)) return (NOTOK); + return (parse(inLine,disp->subTable, glob, ++level)); +} +/* end of function: ind_attrs */ + +PRIVATE int cache_expire(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_int_param(inLine, &glob->cache_expire, glob)); +} +/* end of function: cache_expire */ + +PRIVATE int maxcount(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_int_param(inLine, &glob->maxcount, glob)); +} +/* end of function: maxcount */ + +PRIVATE int language(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char tmp[BUFSIZ]; +int slots = 2, i = 0; + + glob->language = (char **) ch_calloc(slots+1, sizeof(char **)); + if (sscanf(inLine->value, "%*s%s", tmp) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + do { + if(i == slots){ + slots *= 2; + glob->language = (char **) ch_realloc((char *)glob->language, (slots+1)*sizeof(char **)); + } + glob->language[i++] = strdup(tmp); + if(!do_readf(inLine, NULL)) + return (OK); + if (sscanf(inLine->value, "%s", tmp) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } while(inLine->value[0] == ' ' || inLine->value[0] == '\t'); + return (DONE); +} +/* end of function: language */ + +PRIVATE int strict_basedn(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + + glob->strict_basedn = 1; + return (OK); +} +/* end of function: strict_basedn */ + +PRIVATE int pull_down_menus(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + + glob->pull_down_menus = 1; + return (OK); +} +/* end of function: pull_down_menus */ + +PRIVATE int no_proxy(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + + glob->no_proxy = 1; + return (OK); +} +/* end of function: no_proxy */ + +PRIVATE int disp_sea_rdn(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + + glob->disp_sea_rdn = 1; + return (OK); +} +/* end of function: disp_sea_rdn */ + +PRIVATE int prefer_ref_uris(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + + glob->prefer_ref_uris = 1; + return (OK); +} +/* end of function: prefer_ref_uris */ + +PRIVATE int strip_pin(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + + return(get_str_param(inLine, &glob->strip_pin, glob, 1)); +} +/* end of function: strip_pin */ + +PRIVATE int legal(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char tmp[BUFSIZ]; + + sscanf(inLine->value, "%*s%s", tmp); + glob->legal = 1; + glob->legal_top = tmp && !strcasecmp(tmp, "ON-TOP"); + return (OK); +} +/* end of function: legal */ + +PRIVATE int no_modify(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->no_modify, glob, 1)); +} +/* end of function: no_modify */ + +PRIVATE int no_show_rdn(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->no_show_rdn, glob, 1)); +} +/* end of function: no_show_rdn */ + +PRIVATE int sort(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + char object_class[BUFSIZ]; + char label[BUFSIZ]; + char priority[BUFSIZ]; + char display_class[BUFSIZ]; + char sort_attr[BUFSIZ]; + pSORT_LINE *s_ptr; + + s_ptr = &glob->sort; + strcpy(sort_attr, "sn"); + strcpy( display_class, "default" ); + + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*s%s%*[^\"]\"%[^\"]\"%s%s%s", object_class, label, priority, display_class, sort_attr) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + } else + if (sscanf(inLine->value, "%*s%s%s%s%s%s", object_class, label, priority, display_class, sort_attr) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + do { + char tmpBuf[BUFSIZ]; + + *s_ptr = (pSORT_LINE) ch_calloc(1, sizeof(SORT_LINE)); + sprintf (tmpBuf, "|%s|", object_class); + (*s_ptr)->object_class = str_tolower (strdup(tmpBuf)); + (*s_ptr)->label = strdup(label); + (*s_ptr)->priority = atoi(priority); + (*s_ptr)->display_class = str_tolower( strdup( display_class )); + (*s_ptr)->sort_attr = strdup( str_tolower( sort_attr )); + s_ptr = &(*s_ptr)->next; + + if(!charray_inlist(glob->sort_attribs, sort_attr)) + charray_add(&glob->sort_attribs, sort_attr ); + + if(!do_readf(inLine, NULL)) + return (OK); + + strcpy(sort_attr, "sn"); + strcpy( display_class, "default" ); + + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%s%*[^\"]\"%[^\"]\"%s%s%s", object_class, label, priority, display_class, sort_attr) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%s%s%s%s%s", object_class, label, priority, display_class, sort_attr) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + } while(inLine->value[0] == ' ' || inLine->value[0] == '\t'); + + return (DONE); +} +/* end of function: sort */ + +PRIVATE int form_button(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + char read_menu[BUFSIZ]; + char object_class[BUFSIZ]; + char method[BUFSIZ]; + char script_url[BUFSIZ]; + char text[BUFSIZ]; + char dn_name[BUFSIZ]; + char form_name[BUFSIZ]; + char button_label[BUFSIZ]; + pFORM_BUTTON *f_ptr; + + f_ptr = &glob->form_button; +/* for(f_ptr = &glob->form_button; (*f_ptr)->next; f_ptr = &(*f_ptr)->next) + ; +*/ + + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*s%s%s%s%s%*[^\"]\"%[^\"]\"%s%s%s", read_menu, object_class, method, script_url, text, dn_name, form_name, button_label) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + } else + if (sscanf(inLine->value, "%*s%s%s%s%s%s%s%s%s", read_menu, object_class, method, script_url, text, dn_name, form_name, button_label) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + do { + + *f_ptr = (pFORM_BUTTON) ch_calloc(1, sizeof(FORM_BUTTON)); + (*f_ptr)->read_menu = strcasecmp(read_menu, "READ") ? 0 : 1; + (*f_ptr)->object_class = strdup(object_class); + (*f_ptr)->method = strdup(method); + (*f_ptr)->script_url = strdup(script_url); + (*f_ptr)->text = strdup(text); + (*f_ptr)->dn_name = strdup(dn_name); + (*f_ptr)->form_name = strdup(form_name); + (*f_ptr)->button_label = strdup(button_label); + f_ptr = &(*f_ptr)->next; + + if(!do_readf(inLine, NULL)) + return (OK); + + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%s%s%s%s%*[^\"]\"%[^\"]\"%s%s%s", read_menu, object_class, method, script_url, text, dn_name, form_name, button_label) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%s%s%s%s%s%s%s%s", read_menu, object_class, method, script_url, text, dn_name, form_name, button_label) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + } while(inLine->value[0] == ' ' || inLine->value[0] == '\t'); + + return (DONE); +} +/* end of function: form_button */ + +PRIVATE int firstPage(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char attribute[BUFSIZ]; +char label[BUFSIZ]; +char type[BUFSIZ]; +pDISPLAY_LINE *dis_ptr; +pDISPLAY d_ptr; + + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*s%s%*[^\"]\"%[^\"]\"%s", attribute, label, type) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%*s%s%s%s", attribute, label, type) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + for(d_ptr = glob->display; d_ptr->next; d_ptr = d_ptr->next) + ; + dis_ptr = &d_ptr->first_page; + do { + *dis_ptr = (pDISPLAY_LINE) ch_calloc(1, sizeof(DISPLAY_LINE)); + (*dis_ptr)->attribute = str_tolower( strdup( attribute )); + (*dis_ptr)->label = strdup(label); + (*dis_ptr)->type = strdup( str_toupper( type )); + (*dis_ptr)->ty = cnvt_str2int (type, disp_types, "DEFAULT"); + if(!do_readf(inLine, NULL)) + return (OK); + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%s%*[^\"]\"%[^\"]\"%s", attribute, label, type) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%s%s%s", attribute, label, type) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + dis_ptr = &(*dis_ptr)->next; + + } while(inLine->value[0] == ' ' || inLine->value[0] == '\t'); + + return (parse(inLine,disp->subTable, glob, ++level)); +} +/* end of function: firstPage */ + +PRIVATE int secondPage(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char attribute[BUFSIZ]; +char label[BUFSIZ]; +char type[BUFSIZ]; +pDISPLAY_LINE *dis_ptr; +pDISPLAY d_ptr; + + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*s%s%*[^\"]\"%[^\"]\"%s", attribute, label, type) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%*s%s%s%s", attribute, label, type) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + for(d_ptr = glob->display; d_ptr->next; d_ptr = d_ptr->next) + ; + dis_ptr = &d_ptr->second_page; + do { + *dis_ptr = (pDISPLAY_LINE) ch_calloc(1, sizeof(DISPLAY_LINE)); + (*dis_ptr)->attribute = str_tolower( strdup( attribute )); + (*dis_ptr)->label = strdup(label); + (*dis_ptr)->type = strdup( str_toupper( type )); + (*dis_ptr)->ty = cnvt_str2int (type, disp_types, "DEFAULT"); + if(!do_readf(inLine, NULL)) + return (OK); + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%s%*[^\"]\"%[^\"]\"%s", attribute, label, type) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%s%s%s", attribute, label, type) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + dis_ptr = &(*dis_ptr)->next; + + } while(inLine->value[0] == ' ' || inLine->value[0] == '\t'); +/*puts("leaving secondpage!"); +*/ + + return (DONE); +} +/* end of function: secondPage */ + +PRIVATE int modattr(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char attribute[BUFSIZ]; +char label[BUFSIZ]; +char count[BUFSIZ]; +pMODIFY_LINE *mod_ptr; +pMODIF m_ptr; + + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*s%s%*[^\"]\"%[^\"]\"%s", attribute, label, count) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%*s%s%s%s", attribute, label, count) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + for(m_ptr = glob->modify; m_ptr->next; m_ptr = m_ptr->next) + ; + mod_ptr = &m_ptr->modattr; + do { + *mod_ptr = (pMODIFY_LINE) ch_calloc(1, sizeof(MODIFY_LINE)); + (*mod_ptr)->attribute = str_tolower( strdup( attribute )); + (*mod_ptr)->label = strdup(label); + (*mod_ptr)->count = atoi(count); + if(!do_readf(inLine, NULL)) + return (OK); + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%s%*[^\"]\"%[^\"]\"%s", attribute, label, count) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%s%s%s", attribute, label, count) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + mod_ptr = &(*mod_ptr)->next; + + } while(inLine->value[0] == ' ' || inLine->value[0] == '\t'); +/*puts("leaving secondpage!"); +*/ + + return (DONE); +} +/* end of function: modattr */ + +PRIVATE int ind_attribute(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ +char key[BUFSIZ]; +char replace[BUFSIZ]; +char attribute[BUFSIZ]; +char host[BUFSIZ]; +char port[BUFSIZ]; +char base[BUFSIZ]; +pIND_ATTRS i_ptr; +IND_ATTR_ARR **idx; +int i; + + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%*s%s%s%s%s%s%*[^\"]\"%[^\"]\"", key, + replace, attribute, host, port, base) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%*s%s%s%s%s%s%s", key, replace, attribute, + host, port, base) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + for(i_ptr = glob->ind_attrs; i_ptr->next; i_ptr = i_ptr->next) + ; + + idx = &i_ptr->ia_arr; + + *idx = (IND_ATTR_ARR *) ch_malloc( 100 * sizeof(IND_ATTR_ARR) ); + i = 0; + + do { + (*idx)[i].key = strdup(key); + (*idx)[i].replace = !strcasecmp(replace, "function") ? 2 : + !strcasecmp(replace, "replace") ? 1 : 0; + (*idx)[i].attr = strdup(attribute); + (*idx)[i].host = strdup(host); + (*idx)[i].port = atoi(port); + (*idx)[i].base = strdup(base); + (*idx)[++i].key = NULL; + + if(!do_readf(inLine, NULL)) + return (OK); + if(strchr(inLine->value, '"')) { + if (sscanf(inLine->value, "%s%s%s%s%s%*[^\"]\"%[^\"]\"", key, replace, attribute, host, port, base) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + } else + if (sscanf(inLine->value, "%s%s%s%s%s%s", key, replace, attribute, host, port, base) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", glob->acfilename, inLine->count, inLine->value); + + } while(inLine->value[0] == ' ' || inLine->value[0] == '\t'); + + return (DONE); +} +/* end of function: ind_attribute */ + + +PUBLIC void langinit(glob) +GLOB_STRUCT *glob; +{ + FILE *fp; + char inLine[BUFSIZ], lCountS[BUFSIZ], phrase[BUFSIZ], file[BUFSIZ]; + + sprintf( file, "%s.lang.%s", glob->argv0, glob->lang ); + if(!(fp = fopen(file, "r"))) { + fprintf(stderr, "\n\nATTENTION!!!\n\nCould not open file %s !\n", file); + exit(0); + } + while(fgets(inLine, BUFSIZ-1, fp)) { + + /* Comment-sign is accepted in the first column only */ + if(*inLine == '#') + *inLine = '\0'; + if(*inLine == '\t') { + strcat(strcat(glob->la[atoi(lCountS)], " "), trim(inLine, " \t\n")); + continue; + } + if(!*(trim(inLine, " \t\n"))) continue; + sscanf(trim(inLine, " \t\n"), "%s %[^\n]", lCountS, phrase); + if(*glob->la[atoi(lCountS)]) + fprintf(stderr, "\nWarning: glob->la[%s] existed already with value <%s> and was overwritten with value <%s> !\n\n", lCountS, glob->la[atoi(lCountS)], phrase ); + strcpy(glob->la[atoi(lCountS)], phrase); + } + +} +/* end of function: langinit */ + +PUBLIC void langoutput(fp, glob, html_flag) +FILE *fp; +GLOB_STRUCT *glob; +int html_flag; +{ + int i; + + fprintf(fp, "%s\n\n\nLanguage Settings\n\n%s",html_flag ? "<H2>" : "", html_flag ? "</H2>" : "\n"); + for(i=0 ; i<LANG_ARR_SIZE; i++) + if(*glob->la[i]) fprintf(fp, "%s%d%s\t%s%s", html_flag ? "<H2>" : "", i, html_flag ? "</H2>" : "", glob->la[i], html_flag ? "<br>" : "\n"); +} +/* end of function: langoutput */ + +PUBLIC void get_lang(argc, argv, lang) +int argc; +char **argv; +char *lang; +{ + int i; + + for(i=1;i<argc;i++) + if (strstr(argv[i] , "-L")){ + strcpy(lang, argv[i]+2); + } + if(!*lang){ + usage(argv[0]); + exit(0); + } +} +/* end of function: get_lang */ + +PRIVATE int header(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->header, glob, 0)); +} +/* end of function: header */ + +PRIVATE int footer(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->footer, glob, 0)); +} +/* end of function: footer */ + +PRIVATE int allow_msg(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + return(get_str_param(inLine, &glob->allow_msg, glob, 0)); +} +/* end of function: allow_msg */ + +PRIVATE int ip_refuse(inLine, disp, glob, level) +FILELINE *inLine; +PARSE_ENTRY *disp; +GLOB_STRUCT *glob; +int level; +{ + char dat_file[BUFSIZ]; + char rereadcycle[BUFSIZ]; + + if (sscanf(inLine->value, "%*s%s%s", dat_file, rereadcycle) < 1) + fprintf(stderr, "\nWarning: Error in init-file %s, line %d:\n%s\n", + glob->acfilename, inLine->count, inLine->value); + + glob->ip_refuse = (IP_REFUSE *) ch_calloc(1, sizeof(IP_REFUSE)); + glob->ip_refuse->dat_file = strdup( dat_file ); + glob->ip_refuse->rereadcycle = atoi(rereadcycle); + + return (OK); +} /* ip_refuse */ + +PUBLIC void file_test(filename, etcdir) +char **filename; +char *etcdir; +{ + FILE *fp; + char newfname[BUFSIZ]; + + if(*filename){ + if(!(fp = fopen(*filename, "r"))) { + sprintf(newfname, "%s%s", etcdir, *filename); + if(!(fp = fopen(newfname, "r"))) { + sprintf(newfname, "%s.%s", newfname, globP->lang); + fp = fopen(newfname, "r"); + } + } + if(fp) { + free(*filename); + *filename = strdup(newfname); + fclose(fp); + } else { + fprintf(stderr, "\n\nCould not open file %s !\n\n", + *filename); + } + } +} +/* end of function: file_test */ + +PRIVATE void f_test(glob) +GLOB_STRUCT *glob; +{ + pSEARCH_ONLY_LINE so_ptr; + + file_test(&glob->helpfile, glob->etcdir); + file_test(&glob->filterfile, glob->etcdir); + file_test(&glob->friendlyfile, glob->etcdir); + file_test(&glob->header, glob->etcdir); + file_test(&glob->footer, glob->etcdir); + file_test(&glob->allow_msg, glob->etcdir); + if(glob->basedn) { + file_test(&glob->basedn->head, glob->etcdir); + file_test(&glob->basedn->foot, glob->etcdir); + } + for(so_ptr = glob->search_only; so_ptr; so_ptr = so_ptr->next) { + file_test(&so_ptr->head, glob->etcdir); + file_test(&so_ptr->foot, glob->etcdir); + } +} +/* end of function: f_test */ + + diff --git a/contrib/tweb/init.h b/contrib/tweb/init.h new file mode 100644 index 0000000000000000000000000000000000000000..8de4f428b045d078f9b4043f04913ab92e47be26 --- /dev/null +++ b/contrib/tweb/init.h @@ -0,0 +1,289 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* init.h..... * +* * +* Function:..File for TWEB-SOFTWARE * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* July 21 1995 Z D D V V * +* Last modification: Z D D V V * +* May 14 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: init.h,v 1.6 1999/09/10 15:01:17 zrnsk01 Exp $ + * + */ + +#ifndef _INIT_ +#define _INIT_ + +#include <getopt.h> +#include "strng_exp.h" +#include "init_exp.h" +#include "charray_exp.h" +#include "ch_malloc_exp.h" +#include "support_exp.h" + +#ifdef TUE_TEL +# include "tueTel_exp.h" +#endif + +#ifdef AMBIXGW +# include "ambix_exp.h" +#endif + + +/* Usage-Text */ +#define USAGE "\nUSAGE: %s -Lx[yz..] [-p webport] [-x ldaphost]\ + \n\t\t[-P ldapport] [-b basedn] [-f filterfile] [-l logger] [-d]\n\ + \n\ + A short description of TWEB WWW2X.500-Gateway: \n\n\ + (does not compensate reading the README files\n\ + and the correct configuration)\n\ + \n\ + Options:\n\n\ + -L:\ttells TWEB the numbers of the languages that have to be started,\n\ + \twherewith are also created the language-buttons\n\ + \tExample: tweb -L01 starts TWEB in german und english\n\ + -p:\tnames the port on which the gateway is to be reached\n\ + -x:\tnames the LDAP-Hosts\n\ + -P:\tnames the port of the LDAP-Server\n\ + -b:\tnames the DN where the gateway shall start by default\n\ + -f:\tnames the ldapfilter-file\n\ + -l:\tswitches on logging for example LOCAL3\n\ + -d:\tswitches on debugging (no sub-processes!)\n\ + \n" + + +/* Funktions in the init-module */ +PRIVATE int webdn(); +PRIVATE int webpw(); +PRIVATE int webdn2(); +PRIVATE int webpw2(); +PRIVATE int webport(); +PRIVATE int timeout(); +PRIVATE int ldapd(); +PRIVATE int ldapportf(); +PRIVATE int hostname(); +PRIVATE int header(); +PRIVATE int footer(); +PRIVATE int index_url(); +PRIVATE int allow_msg(); +PRIVATE int helpfilef(); +PRIVATE int filterfilef(); +PRIVATE int etcdir(); +PRIVATE int friendlyfilef(); +PRIVATE int grant(); +PRIVATE int refuse(); +PRIVATE int allow_string(); +PRIVATE int allow_proxy(); +PRIVATE int subtree_search(); +PRIVATE int deny_string(); +PRIVATE int show_defoc(); +PRIVATE int display(); +PRIVATE int basednf(); +PRIVATE int search_only(); +PRIVATE int gw_switch(); +PRIVATE int modify(); +PRIVATE int ind_attrs(); +PRIVATE int ind_attribute(); +PRIVATE int maxcount(); +PRIVATE int cache_expire(); +PRIVATE int max_person(); +PRIVATE int caching_terms(); +PRIVATE int comrefuse(); +PRIVATE int language(); +PRIVATE void f_test(); +PRIVATE void main_loop(); +PRIVATE int strip_pin(); +PRIVATE int prefer_ref_uris(); +PRIVATE int pull_down_menus(); +PRIVATE int no_proxy(); +PRIVATE int disp_sea_rdn(); +PRIVATE int strict_basedn(); +PRIVATE int dynamic_gw(); +PRIVATE int legal(); +PRIVATE int no_show_rdn(); +PRIVATE int no_modify(); +PRIVATE int sort(); +PRIVATE int firstPage(); +PRIVATE int secondPage(); +PRIVATE int modattr(); +PRIVATE void usage(); +PRIVATE int parse(); +PRIVATE int parse2(); +PRIVATE int table_disp(); +PRIVATE int form_button(); +PRIVATE int ip_refuse(); + + +/* Sub-tables to analyse the DISPLAY-Keys */ +static PARSE_ENTRY first_table[] = { + {"SECOND-PAGE", secondPage, NULL}, + { NULL, NULL, NULL } +}; + +static PARSE_ENTRY display_table[] = { + {"FIRST-PAGE", firstPage, first_table}, + { NULL, NULL, NULL } +}; + + +/* Sub-tables to analyse the MODIFY-Keys */ +static PARSE_ENTRY modify_table[] = { + {"MODATTR", modattr, NULL}, + { NULL, NULL, NULL } +}; + +/* Sub-tables to analyse the IND_ATTRS-Keys */ +static PARSE_ENTRY ind_attrs_table[] = { + {"IND_ATTRS", ind_attribute, NULL}, + { NULL, NULL, NULL } +}; + + +/* The main-table for key-word-parsing */ +static PARSE_ENTRY parse_table[] = { + {"WEBDN", webdn, NULL}, + {"WEBPW", webpw, NULL}, + {"WEBDN2", webdn2, NULL}, + {"WEBPW2", webpw2, NULL}, + {"WEBPORT", webport, NULL}, + {"TIMEOUT", timeout, NULL}, + {"TWEBHOST", hostname, NULL}, + {"LDAPD", ldapd, NULL}, + {"LDAPPORT", ldapportf, NULL}, + {"HEADER", header, NULL}, + {"FOOTER", footer, NULL}, + {"INDEX-URL", index_url, NULL}, + {"ALLOW-MSG", allow_msg, NULL}, + {"HELPFILE", helpfilef, NULL}, + {"FILTERFILE", filterfilef, NULL}, + {"ETCDIR", etcdir, NULL}, + {"FRIENDLYFILE", friendlyfilef, NULL}, + {"GRANT", grant, NULL}, + {"REFUSE", refuse, NULL}, + {"ALLOW-STRING", allow_string, NULL}, + {"ALLOW-PROXY", allow_proxy, NULL}, + {"SUBTREE-SEARCH", subtree_search, NULL}, + {"DENY-STRING", deny_string, NULL}, + {"SHOW-DEFAULT-OC", show_defoc, NULL}, + {"DISPLAY-OBJECT" , display, display_table}, + {"BASEDN", basednf, NULL}, + {"SEARCH-ONLY", search_only, NULL}, + {"GW-SWITCH", gw_switch, NULL}, + {"MODIFY", modify, modify_table}, + {"INDIRECT-ATTRS", ind_attrs, ind_attrs_table}, + {"MAXCOUNT", maxcount, NULL}, + {"CACHE-EXPIRE-DEFAULT", cache_expire, NULL}, + {"MAX-PERSON", max_person, NULL}, + {"CACHING-TERMS", caching_terms, NULL}, + {"COMREFUSE", comrefuse, NULL}, + {"LANGUAGE", language, NULL}, + {"STRIP-PIN", strip_pin, NULL}, + {"PREFER-REF-URIS", prefer_ref_uris, NULL}, + {"PULL-DOWN-MENUS", pull_down_menus, NULL}, + {"NO-PROXY", no_proxy, NULL}, + {"DISP-SEA-RDN", disp_sea_rdn, NULL}, + {"STRICT-BASEDN", strict_basedn, NULL}, + {"DYNAMIC-GW", dynamic_gw, NULL}, + {"LEGAL", legal, NULL}, + {"NO-SHOW-RDN", no_show_rdn, NULL}, + {"NO-MODIFY", no_modify, NULL}, + {"SORT", sort, NULL}, + {"TABLES", table_disp, NULL}, + {"FORM-BUTTON", form_button, NULL}, + +#ifdef AMBIXGW + {"SELBSTEINTRAG", selbsteintrag, NULL}, +#endif + +#ifdef TUE_TEL + {"DIT-CONFIG", dit_config, NULL}, + {"PHONEWORLD", phoneworld, NULL}, + {"TON-URLS", ton_urls, NULL}, +#endif + {"IP-REFUSE", ip_refuse, NULL}, + + { NULL, NULL, NULL } +}; + + +/* tables to compute DISPLAY-types to integer */ +STRDISP disp_types[] = { + + { "DEFAULT", 3, 0 }, + { "MAILTO", 4, 6 }, + { "MULTILINE", 5, 1 }, + { "JPEG", 4, 9 }, + { "JPEG2GIF", 8, 10 }, + { "BMP", 3, 8 }, + { "HREF", 4, 2 }, + { "URL", 3, 5 }, + { "FINGER", 6, 3 }, + { "DATE", 4, 4 }, + { "MOVETO", 4, 7 }, + { "BOOLEAN", 9, 11 }, + { "URI", 3, 12 }, + { "PGPKEY", 6, 13 }, + { "INDEXURL", 8, 14 }, + { "DYNAMICDN", 9, 15 }, + { "REFERRAL", 8, 20 }, + { "PRE", 3, 21 }, + { "HEADER", 6, 22 }, + +#ifdef TUE_TEL + { "PHONREFSHORT", 12, 16 }, + { "PHONREFLONG", 11, 17 }, + { "TFUNCPERS", 9, 18 }, + { "FAXTABLE", 8, 19 }, +#endif + + { NULL, 0, 0 } + +}; + +/* tables to compute syslog-options to integer */ +static STRDISP syslog_types[] = { + + { "LOCAL0", 6, LOG_LOCAL0 }, + { "LOCAL1", 6, LOG_LOCAL1 }, + { "LOCAL2", 6, LOG_LOCAL2 }, + { "LOCAL3", 6, LOG_LOCAL3 }, + { "LOCAL4", 6, LOG_LOCAL4 }, + { "LOCAL5", 6, LOG_LOCAL5 }, + { "LOCAL6", 6, LOG_LOCAL6 }, + { "LOCAL7", 6, LOG_LOCAL7 }, + { NULL, 0, 0 } + +}; + + +/* Defaults */ +#define DEFAULT_TIMEOUT 120 +#define DEFAULT_MAXCOUNT 200 +#define MAX_EXPIRE 604800 + + +/* Variable for the Anti-Hack-Code */ +extern COMREFUSE *comRefuseP; + +struct timeval timestore[5]; /* Time assigned to events: + 0 -> after accept, 1-> after dns, + 2 -> after check4access, + 3 -> before list_output/print_attr */ + +int items_displayed = 0; /* number of items showed on + do_menu/do_search*/ + +#endif /* _INIT_ */ + diff --git a/contrib/tweb/init_exp.h b/contrib/tweb/init_exp.h new file mode 100644 index 0000000000000000000000000000000000000000..5ef68fadcd9bdbb838f85c4ee377b3f64b0a2316 --- /dev/null +++ b/contrib/tweb/init_exp.h @@ -0,0 +1,382 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* init_exp.h. * +* * +* Function:..File for TWEB-SOFTWARE * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* July 21 1995 Z D D V V * +* Last modification: Z D D V V * +* May 11 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ +/* + * $Id: init_exp.h,v 1.6 1999/09/10 15:01:17 zrnsk01 Exp $ + * + */ + + +#ifndef _INIT_EXP_ +#define _INIT_EXP_ + +#ifdef TUE_TEL +# include "tueTel_exp.h" +#endif + +#include "regular_exp.h" + +PUBLIC int get_str_param(/* FILELINE *inLine, char **str, + GLOB_STRUCT *glob, int lower */); + +PUBLIC void getopts (); +PUBLIC void check (); +PUBLIC void init(); +PUBLIC void output(); +PUBLIC void langinit(); +PUBLIC void langoutput(); +PUBLIC void get_lang(); +PUBLIC void file_test(); +PUBLIC int do_readf(); +PUBLIC void get_index_url_rules(); +PUBLIC void re_read_index_url_rules(); + +extern STRDISP disp_types[]; + + +/* A pointer to an integer-function */ +typedef int (*IFP)(); + + +/* One line in the config-file, with line-counter */ +typedef struct _fileline { + char value[BUFSIZ]; + int count; +} FILELINE; + + +/* Table-structure to parse the key-words in the config- und rc-files */ +typedef struct _parse_keys { + char *keyWord; + IFP keyFunc; + struct _parse_keys *subTable; +} PARSE_ENTRY; + + +/* Maximum number of sub-lists in order to display result-lists */ +#define MAX_OCS 128 + +/* List of attributes which will be displayed (on 1./2. page) */ +typedef struct _display_line { + char *attribute; /* the X.500-Attribute */ + char *label; /* the Label of the Web-Page */ + char *type; /* the Format-Type as String (C-Option) */ + int ty; /* the Format-Type as Int (print-Funkt.) */ + struct _display_line *next; /* the next Attribute */ +} DISPLAY_LINE, *pDISPLAY_LINE; + + +/* List of Object-Classes which shall be displayed */ +typedef struct _display { + char *ocs; /* the X.500-Object-Class(es) */ + DISPLAY_LINE *first_page; /* Attribute on the first page */ + DISPLAY_LINE *second_page; /* Attribute on the second page */ + struct _display *next; /* the next Objekt-Class(es) */ +} DISPLAY, *pDISPLAY; + + +/* List of attributes which may be modified */ +typedef struct _modify_line { + char *attribute; /* the X.500-attribute */ + char *label; /* the Label in the modification-formulare */ + int count; /* the maximmum number of attribute-values */ + struct _modify_line *next; /* the next attribute */ +} MODIFY_LINE, *pMODIFY_LINE; + +/* List of Object-Class(es) which may be modified */ +typedef struct _modify { + char *ocs; /* the X.500-Object-Class(es) */ + MODIFY_LINE *modattr; /* the modifyable attributes */ + struct _modify *next; /* the next Object-Class(es) */ +} MODIF, *pMODIF; + +/*attributes which are read from another entry */ +typedef struct _ind_attr_arr { + char *key; /* pers for person etc. */ + int replace; /* 2 -> function, 1 -> replace, 0 -> append */ + char *attr; /* functionname / referenced attribute */ + char *host; /* on which host to look */ + int port; /* on which port to look */ + char *base; /* where to look for ref-entry */ + LDAPMessage **e; /* Pointer to the result */ + LDAP *ld; /* Pointer to the matching LDAP-Struct */ +} IND_ATTR_ARR; + +typedef struct _ind_attrs { + char *ref_attr; /* name of the reference-attribute */ + IND_ATTR_ARR *valid_nodes; /* valid nodes array (only in 1st element) */ + IND_ATTR_ARR *ia_arr; /* supported keys, attrs and bases */ + struct _ind_attrs *next; /* the next ind_attr */ +} IND_ATTRS, *pIND_ATTRS; + + +/* Support-structure to sort the result-lists */ +typedef struct _dncompare { + char *string; /* Sort-String */ + char *href; /* Hyper-Link for the sorted entry */ + char *raw; /* Raw data: -> <name>[<attr>=<value>&..%..$.. */ +} DNLIST, *pDNLIST; + + +/* Structure to sort the result-lists object-class/attribute-related */ +typedef struct _sort_line { + char *object_class; /* Object-class by which is sorted */ + char *label; /* Label to display sub-lists */ + int priority; /* Sequence for list-output */ + char *display_class; /* dedicated display-class */ + DISPLAY *display_class_ptr; /* Pointer therefor */ + char *sort_attr; /* Attribut by which sorting is done */ + pDNLIST *dnList; /* Entries in the sub-list */ + int dnLast; /* Amount of entries in the sub-list */ + int restricted; /* 1 -> sub-list was restricted : 0 -> not*/ + struct _sort_line *next; /* the next Object-Class */ +} SORT_LINE, *pSORT_LINE; + +/* Structure to handle caching */ + +typedef struct _caching_terms_line { + int time; /* time to cache */ + char *access_type; /* type of access */ + int rdn_oc; /* 1 -> rdn, 0 -> oc -lookup */ + char *pattern; /* mach-pattern: oc/rdn */ + struct _caching_terms_line *next; /* the next line */ +} CACHING_TERMS_LINE, *pCACHING_TERMS_LINE; + + +/* DN of the TWEB-Homepage, including header and footer thereof */ +typedef struct _basedn_line { + char *dn; + char **dnarray; + char *head; + char *foot; +} BASEDN_LINE; + +/* List of rules for table-button and table display */ +typedef struct _table_display { + int allow; /* 1 -> tables only if allowed, 0 -> in any case */ + char *select_oc; /* table-button only if + objectclass contains select_oc */ + char *button_label; /* label for table-request-button */ + char *dn_extension; /* extension behind button Xdn?MENU */ + struct _table_display *next; +} TABLE_DISPLAY, *pTABLE_DISPLAY; + +/* List of organisational units where only searching is permitted, + including header and footer thereof */ +typedef struct _search_only_line { + char *dn; + char *head; + char *foot; + struct _search_only_line *next; +} SEARCH_ONLY_LINE, *pSEARCH_ONLY_LINE; + +/* Anti-Hack Structure */ +typedef struct _comrefuse { + int tmin; + int tdiff; + int maxAccept; + int suspendCycle; + time_t statCycle; + char *statFile; +} COMREFUSE; + + +/* static list of Gateway-Switches */ +typedef struct _gw_switch_line { + char *dn; /* the DN of the organization(al unit) */ + char *url; /* the URL of the gateway to be called */ + struct _gw_switch_line *next; /* the next Gateway-Switch */ +} GW_SWITCH_LINE, *pGW_SWITCH_LINE; + +/* the head of the Gateway-Switch-list */ +typedef struct _gw_switch { + int dynamic; /* is dynamic switching allowed */ + char *lagws; /* language dependant recognition of + GW-Switch-entries in X.500 + (language independant recognition is + implemented by macro) */ + GW_SWITCH_LINE *list; /* the static list of switches */ +} GW_SWITCH, *pGW_SWITCH; + +/* static list of already available ldap-connections */ +typedef struct _ld_list { + LDAP *ld; /* pointer to the ldap-structure */ + char *host; /* The corresponding host */ + int port; /* The corresponding port */ + struct _ld_list *next; /* the next */ +} LD_LIST, *pLD_LIST; + +typedef struct _index_url_rule { + char *rule; /* Atribute providing data */ + char *dit_dn; /* DN supporting config */ +} INDEX_URL_RULE; + +typedef struct _index_url { + char *dat_file; /* File providing data */ +#define INDEX_RULE_SIZE 20 + INDEX_URL_RULE rarr[INDEX_RULE_SIZE]; /* array with rules */ + int rereadcycle; /* frequency to reread */ +} INDEX_URL; + +/* Structure to hold config of buttons leading to form-scripts */ +typedef struct _form_button { + int read_menu; /* 1-> button in do_read; 0-> in do_menu */ + char *object_class; /* display the button on presence of this + object-class*/ + char *method; /* cgi method: GET .. */ + char *script_url; /* URL of CGI-Script */ + char *text; /* text in front of button */ + char *dn_name; /* name of dn in hidden form */ + char *form_name; /* name of form (submit-button) */ + char *button_label; /* label of submit-button */ + struct _form_button *next; /* the next FORM_BUTTON definition */ +} FORM_BUTTON, *pFORM_BUTTON; + +typedef struct _ip_refuse { + char *dat_file; /* File providing data */ + char *refu_str; /* String of refused clients */ +#define REFU_BUFSIZ 256 +#define REFU_STRDELIM "&" + + int rereadcycle; /* frequency to reread */ +} IP_REFUSE; + +/* the central structure of TWEB with the configuration of the gateway */ +typedef struct _glob_struct { + char *webdn; /* GW-DN in case of authorisded access */ + char *webpw; /* GW-PW in case of authorisded access */ + char *webdn2; /* GW-DN in case of non-authorisded access */ + char *webpw2; /* GW-PW in case of non-authorisded access */ + int webport; /* the Port the GW is listening on */ + int timeout; /* how long does the gateway wait for the DSA*/ + time_t stat_slice; /* Time for the anti-Hack + Statistic */ + char *ldapd; /* the computer LDAPD is running on */ + int ldapport; /* the Port thereof */ + char *grant; /* ':'-separated list of domains with access */ + char *refuse; /* ':'-separated list of domains + without access */ + char *allow_string; /* ':'-separated list of domains + supported with authorised access */ + char *deny_string; /* ':'-separated list of domains + supported with restricted access */ + regexp *comp_grant; /* compiled regular expressions for GRANT */ + regexp *comp_refuse; /* compiled regular expressions for REFUSE */ + regexp *comp_allow; /* compiled regular expressions for ALLOW_ST */ + regexp *comp_deny; /* compiled regular expressions for DENY_ST. */ + char **allow_proxy; /* ':'-separated list of proxy-servers + supported with authorised access */ + char **subtree_search; /* ':'-separated list of objectclasses + where to make subtree_search instead of + single_level_search */ + DISPLAY *display; /* presentation of Objects */ + DISPLAY *default_display_type; /* pointer to the default display descript */ + BASEDN_LINE *basedn; /* the entry-page of TWEB */ + SEARCH_ONLY_LINE *search_only; /* where only searching is supported */ + GW_SWITCH *gw_switch; /* the Gateway-Switching */ + MODIF *modify; /* what may be modified within TWEB */ + IND_ATTRS *ind_attrs; /*attributes which are read from + another entry */ + int cache_expire; /* caching-time for proxies in seconds */ + CACHING_TERMS_LINE *caching_terms; /* cache-control-rules */ + int maxcount; /* maximum amount of result-lists */ + int max_person; /* maximum amount of persons displayed */ + COMREFUSE *comrefuse; /* Anti-Hack Structure */ + TABLE_DISPLAY *tables; /* listings also as tables by button-request */ + INDEX_URL *index_url; /* how to display search-results of index + -> display-type INDEX-URL */ + FORM_BUTTON *form_button; /* display buttons leading to forms */ + char *tables_marker; /* flag for menu with tables += their config */ + char **language; /* the language links on a html-page */ + char lang[2]; /* the number of the "own" language */ + char *olang; /* the other languages */ + char *no_show_rdn; /* String with "unvisible" DN parts */ + char *no_modify; /* Objectclasses without MODIFY-button */ + SORT_LINE *sort; /* how shall the results be sorted */ + SORT_LINE *sorty[MAX_OCS]; /* Array with the sorted lists */ + char **sort_attribs; /* Array with the sort-attributes */ + char *myname; /* the programname */ + char *argv0; /* ARGV[0] */ + char *hostname; /* the name of the computer TWEB + is running on*/ + int virtualport; /* port if defined is set in every link + instead of webport (may always + lead requests over www4ward) */ + char *header; /* the header for the standardpage */ + char *footer; /* the footer for the standardpage */ + char *allow_msg; /* file containing allow-message */ + char *helpfile; /* the helpfile */ + char *filterfile; /* the filterfile for LDAP-search */ + char *etcdir; /* the directory containing the supportfiles */ + char *friendlyfile; /* the file for "more friendly" DNs */ + char *acfilename; /* the name of the actual config-file */ + time_t nowtime; /* actual time in tics */ + time_t expiretime; /* time for cache to expire in tics */ + char *nowtimestr; /* actual timestring in GMT */ + char *strip_pin; /* truncation of PINs at named sort_ocs */ + char *expiretimestr; /* timestring for cache to expire in GMT */ + char *server_connection_msg; /* TCP Connection-message */ + char *user_agent_msg; /* User-Agent message */ + char *menu_filter; /* menu_filter */ +#define LANG_ARR_SIZE 110 + char la[LANG_ARR_SIZE][BUFSIZ]; /* language-specific text-fragments */ + LD_LIST *ld_list; /* List of open LDAP-Connections */ + char **raw_attrs; /* Attributes to be shown with raw_access */ + size_t svc_cnt; /* A counter for the number of requests */ + +#ifdef TUE_TEL + DIT_CONFIG *dit_config; /* container for relations between DNs and + responsible host:port */ + TON_URLS *ton_urls; /* TONs in addition to DNs */ + char *phoneworld; /* visibility of phonebook */ +#endif + IP_REFUSE *ip_refuse; /* refuse certain hosts by ip-addr */ + +#ifdef AMBIXGW + char *selbsteintrag[10]; /* some strings for AMBIX-selfentry */ +#endif + + unsigned show_defoc : 1, /* respect unknown OCs while sorting */ + strict : 1, /* restriction of person-lists also in the + authorised case */ + restricted : 1, /* hard restriction of the extent of the list*/ + persRestricted : 1, /* restriction of person-lists (legal) */ + prefer_ref_uris : 1, /* take over labeledURIS from + referenced objects */ + is_proxy : 1, /* did the request come from a proxy-server */ + pull_down_menus : 1, /* move upwards with pull-down-menus */ + no_proxy : 1, /* no local proxy-servers */ + strict_basedn : 1, /* no access outside BASEDN */ + no_browse : 1, /* no person-lists while browsing */ + noauth : 1, /* dynamic flag for question of authorisation*/ + caching : 1, /* shall be cached by proxy-server */ + legal : 1, /* display privacy-text */ + legal_top : 1, /* display privacy-text on top */ + unknown_host : 1, /* connection from unknown */ + allowed : 1; /* access allowed for decide_access */ + unsigned raw_data : 1, /* provide raw-data instead of html */ + ldap_referral_mode : 1, /* TWEB displayes foreign ldap-url */ + disp_sea_rdn : 1; /* display only rdns as search-result */ +} GLOB_STRUCT, *pGLOB_STRUCT; + + +/* the function the gateway is initialized with */ +void init(); + +#endif /* _INIT_EXP_ */ + diff --git a/contrib/tweb/queries.c b/contrib/tweb/queries.c new file mode 100644 index 0000000000000000000000000000000000000000..1e0ebb40cc4588a03a5bf74e1e507387ccb27738 --- /dev/null +++ b/contrib/tweb/queries.c @@ -0,0 +1,735 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* queries.c.. * +* * +* Function:..WorldWideWeb-X.500-Gateway - Server-Functions * +* Based on web500gw.c 1.3 written by Frank Richter, TU Chemmniz * +* which is based on go500gw by Tim Howes, University of * +* Michigan - All rights reserved * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* August 16 1995 Z D D V V * +* Last modification: Z D D V V * +* May 11 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: queries.c,v 1.6 1999/09/10 15:01:18 zrnsk01 Exp $ + * + */ + +#include "queries.h" + + +PUBLIC void do_queries( s, glob , ip_addr, ip_port, hp) +int s; +GLOB_STRUCT *glob; +char *ip_addr; +unsigned int ip_port; +struct hostent *hp; +{ + char buf[100*BUFSIZ], *query, *tail; + int len; + FILE *fp; + int rc, tblsize; + struct timeval timeout; + fd_set readfds; + LDAP *ld; + char tstring[100]; + + /* get time for performance log */ + gettimeofday(×tore[2], NULL); + + /* open output-port to waiting client */ + if ( (fp = fdopen( s, "a+")) == NULL ) { + perror( "fdopen" ); + exit_tweb( 1 ); + } + + tblsize = getdtablesize(); + timeout.tv_sec = glob->timeout; + timeout.tv_usec = 0; + FD_ZERO( &readfds ); + FD_SET( fileno( fp ), &readfds ); + + time(&glob->nowtime); + time(&glob->expiretime); + if(glob->cache_expire) { + glob->expiretime += glob->cache_expire; + glob->caching =TRUE; + } + free(glob->nowtimestr); + free(glob->expiretimestr); + + strftime(tstring, 99, GMT_FORMAT, gmtime(&glob->nowtime)); + glob->nowtimestr = strdup(tstring); + strftime(tstring, 99, GMT_FORMAT2, gmtime(&glob->expiretime)); + glob->expiretimestr = strdup(tstring); + + /* get client-query out from the system */ + if((rc=select(tblsize,(fd_set *)&readfds,NULL,NULL,&timeout))<=0) + exit_tweb( 1 ); + + if ( fgets( buf, sizeof(buf), fp ) == NULL ) + exit_tweb( 1 ); + + /* Analyse Web-Client-Type / proxy + log-message */ + checkwwwclient(fp, ip_addr, ip_port, hp, glob); + + len = strlen( buf ); + if ( debug ) { + fprintf( stderr, "got %d bytes\n", len ); + lber_bprint( buf, len ); + } + + /* strip of white spaces */ + query = trim (buf, WSPACE); + + rewind (fp); + + + /* strip "HTTP" from the end of the request */ + if ((tail = strstr(query, " HTTP")) != NULL || + (tail = strstr(query, " http")) != NULL) { + http = 1; + *tail = '\0'; + } + + /* recognize GET/HEAD */ + if (!strncasecmp (query, "get", 3)) { + + request = GET; + query += 3; + + } else if (!strncasecmp (query, "head", 4)) { + + request = HEAD; + query += 4; + + } else { + + /* Error because of neither GET- nor HEAD-request */ + do_error(fp, -2, NOT_IMPLEMENTED, glob); + /* fprintf(fp, "HTTP/1.0 501 %s<br>", glob->la[5]); */ + rewind(fp); + exit_tweb( 1 ); + } + + /* strip off leading white space and '/' */ + while ( isspace( *query ) || *query == '/') { + ++query; + } + + + /* Now the real request is to be analized and served */ + + /* refuse robots if according robots.txt file exists */ + + if (!strcasecmp(query, "robots.txt")){ + if (http == 1) PRINT_PLAIN_HEADER; + disp_file(glob, ROBOTS_TXT_FILE, fp); + exit_tweb(0); + } + +#ifdef TUE_TEL + if( glob->ton_urls && *query == cTON) { + if(!glob->ton_urls->admin) + glob->allowed = 0; + if(glob->ton_urls->pass_oc) { + glob->max_person = 10000; + glob->no_browse = FALSE; + } + } +#endif + + decide_access(glob); + + /* get time for performance log */ + gettimeofday(×tore[3], NULL); + + /* perform handling of pulldown/form retcodes + -> gwswitch-redirect || pass */ + if(*query == cPULLDOWN) { + if(strstr(query, "http")) { + /* redirection */ + query += 4; + hex_decode(query); + PRINT_REDIRECT_HEADER; + PRINT_HTML_FOOTER; + exit_tweb(0); + } else { + /* pass */ + query += 7; + hex_decode(query); + } + } + + /* perform handling of buttons/form retcodes + -> gwswitch-redirect || pass */ + if(*query == cBUTTON) { + char *strptr; + + query += 2; + strptr = strrchr( query, '=' ); + *strptr = '\0'; + + if(strstr(query, "http")) { + /* redirection */ + hex_decode(query); + PRINT_REDIRECT_HEADER; + PRINT_HTML_FOOTER; + exit_tweb(0); + } else { + /* pass */ + hex_decode(query); + } + } + + + /* 1. requests that may be served without DSA */ + switch (*query) { + + + /* display Help-File */ + case cHELP: + if (dosyslog) + syslog (LOG_INFO, "working on query: %c (%s,%u) <%08d>", + cHELP, ip_addr, ip_port, glob->svc_cnt); + if (http == 1) PRINT_HTML_HEADER; + fprintf(fp, "<HTML><HEAD>"); + disp_file(glob, glob->helpfile, fp); + PRINT_HTML_FOOTER; + rewind(fp); + exit_tweb( 0 ); + + /* request error-explanation */ + case cERROR: + if (dosyslog) + syslog (LOG_INFO, "working on query: %c (%s,%u) <%08d>", + cERROR, ip_addr, ip_port, glob->svc_cnt); +/* fprintf(fp, HTML_HEAD_TITLE, "Errors", glob->la[100]); +*/ + do_error( fp, 0 , 1, glob ); + rewind(fp); + exit_tweb( 0 ); + + /* RCC: remote configuration control */ + case cCONFIG: + if (dosyslog) + syslog (LOG_INFO, "working on query: %c (%s,%u) <%08d>", + cCONFIG, ip_addr, ip_port, glob->svc_cnt); + if (http == 1) PRINT_HTML_HEADER; + fprintf(fp, HTML_HEAD_TITLE, "Configuration", glob->la[100]); + output(fp, glob, TRUE); + langoutput(fp, glob, TRUE); + PRINT_HTML_FOOTER; + rewind(fp); + exit_tweb(0); + + /* query access-statistic */ + case cSTATS: + if (dosyslog) + syslog (LOG_INFO, "working on query: %c (%s,%u) <%08d>", + cSTATS, ip_addr, ip_port, glob->svc_cnt); + if (http == 1) PRINT_HTML_HEADER; + fprintf(fp, HTML_HEAD_TITLE, "Statistics", glob->la[100]); + fprintf(fp, + "\n<strong>#############STATISTIC-DISPLAY#############</strong><br>\n" ); + fprintf( fp, "\n%s\n\n<p>\n", version ); + (void) put_hackStats (fp, 0); + PRINT_HTML_FOOTER; + rewind (fp); + exit_tweb (0); + + /* NOT REACHED */ + } + + /* with ldap-referral use this host + port + use do_read */ + /* query looks like this: Wldap://host:port/dn */ + if ( *query == cREFERRAL ) { + char *host, *port, *dn = NULL; + + glob->ldap_referral_mode = 1; + if ( ( host = strstr( query, "ldap://" ) ) ) { + host += 7; + if ( ( port = strchr( host, ':' ) ) ) { + *port++ = '\0'; + if ( ( dn = strchr( port, '/' ) ) ) { + *dn = '\0'; + glob->ldapd = strdup ( host ); + glob->ldapport = atoi ( port ); + *dn = cREAD; + query = dn; + } + } + } + if ( !dn ) + exit_tweb( 1 ); + } + + /* from here on there is needed a connection to the DSA */ + if ( (ld = ldap_open( glob->ldapd, glob->ldapport )) == NULL ) { + if ( debug ) perror( "ldap_open" ); + do_error( fp, LDAP_SERVER_DOWN, SERVER_ERROR, glob); + rewind(fp); + exit_tweb( 1 ); + } + + if(glob->caching_terms) + trade_cache(fp, ld, query, glob); + + /* performance of STRICT-BASEDN (blind out accesses != BASEDN) */ + + if(glob->strict_basedn) + strict_basednf(fp, ld, query, glob); + + + /* 2. queries with binding of the owner */ + switch (*query) { + + /* request of the modification-formulare */ + case cGETMOD: + /* log the request without password */ + hex_decode(query); + if (dosyslog) { + char qbuf[BUFSIZ], *qbufp; + + strcpy(qbuf, query); + if( ( qbufp = strchr(qbuf, '?')) ) + *qbufp = '\0'; + syslog (LOG_INFO, "working on query: %s (%s,%u) <%08d>", + qbuf, ip_addr, ip_port, glob->svc_cnt); + } + rewind(fp); + + /* follow aliases while searching */ +#if defined LDAP_VENDOR_NAME && defined LDAP_API_VERSION +# if LDAP_API_VERSION > 2001 && LDAP_API_VERSION < 2010 + + ldap_set_option( ld, LDAP_OPT_DEREF, LDAP_DEREF_ALWAYS ); + +# endif +#else + ld->ld_deref = LDAP_DEREF_ALWAYS; +#endif + + if ( !searchaliases ) +#if defined LDAP_VENDOR_NAME && defined LDAP_API_VERSION +# if LDAP_API_VERSION > 2001 && LDAP_API_VERSION < 2010 + + ldap_set_option( ld, LDAP_OPT_DEREF, LDAP_DEREF_FINDING ); + +# endif +#else + ld->ld_deref = LDAP_DEREF_FINDING; +#endif + + /* send WWW-Formulare with contence of the desired entry + to the client */ + do_form( ld, fp, ++query, glob); + ldap_unbind (ld); + close_ldap_connections(glob); + rewind(fp); + exit_tweb (0); + + /* return of the modification-formulare */ + case cDOMOD: + + /* log the request in readable form without password if desired */ + if (dosyslog) { + + char qbuf[100*BUFSIZ], *qbufp; + + strcpy(qbuf, query); + if( ( qbufp = strchr (qbuf, '?')) ) + *qbufp = '\0'; + hex_decode(qbuf+1); + syslog (LOG_INFO, "working on query: %s (%s,%u) <%08d>", + qbuf, ip_addr, ip_port, glob->svc_cnt); + + } + + /* perform modification with the original request */ + do_modify( ld, fp, ++query, glob); + ldap_unbind (ld); + close_ldap_connections(glob); + rewind(fp); + exit_tweb (0); + + /* NOT REACHED */ + } + + + /* perform all the other requests */ + + /* log the request in readable form first */ + hex_decode(query); + if (dosyslog) + syslog (LOG_INFO, "working on query: %s (%s,%u) <%08d>", + *query ? trimright(query, WSPACE) : "BASEDN", ip_addr, ip_port, + glob->svc_cnt); + + /* accesses with resolvation of alias-entries */ +#if defined LDAP_VENDOR_NAME && defined LDAP_API_VERSION +# if LDAP_API_VERSION > 2001 && LDAP_API_VERSION < 2010 + + ldap_set_option( ld, LDAP_OPT_DEREF, LDAP_DEREF_ALWAYS ); + +# endif +#else + ld->ld_deref = LDAP_DEREF_ALWAYS; +#endif + + if ( !searchaliases ) +#if defined LDAP_VENDOR_NAME && defined LDAP_API_VERSION +# if LDAP_API_VERSION > 2001 && LDAP_API_VERSION < 2010 + + ldap_set_option( ld, LDAP_OPT_DEREF, LDAP_DEREF_FINDING ); + +# endif +#else + ld->ld_deref = LDAP_DEREF_FINDING; +#endif + + /* bind to DSA by order of the user as Web-DN + (if with DN1 or DN2 was decided at check4access) */ + +#if defined LDAP_VENDOR_NAME && defined LDAP_API_VERSION +# if LDAP_API_VERSION > 2001 && LDAP_API_VERSION < 2010 + + /* a dummy call as long as socket connections are not settled + * with OpenLDAP + */ + if ( dosyslog ) + syslog( LOG_INFO, "do_queries(): calling ldap_simple_bind_s()...\n" ); + +# else + + if ( dosyslog ) + syslog( LOG_INFO, "do_queries(): calling ldap_simple_bind_s()...\n" ); + +# endif +#endif + + if ( (rc=ldap_simple_bind_s( ld, glob->webdn, glob->webpw )) + != LDAP_SUCCESS ) { + if ( debug ) ldap_perror( ld, "ldap_simple_bind_s" ); + do_error( fp, rc, SERVER_ERROR, glob); + rewind(fp); + exit_tweb( 1 ); + } + + /* 3. requests to the GW by order of the user */ + switch ( *query++ ) { + + /* read entry */ + case cREAD: + do_read( ld, fp, query, 0, glob ); + break; + + /* display second page */ + case cREADALL: + do_read( ld, fp, query, 1, glob); + break; + + /* search entries */ + case cSEARCH: + do_search( ld, fp, query, glob ); + break; + + /* list entries (browsing) */ + case cLIST: + do_menu( ld, fp, query, "", glob ); + break; + +#ifdef TUE_TEL + /* list entries (browsing TON instead of DN) */ + case cTON: + if(glob->ton_urls) + do_ton( ld, fp, query, glob ); + break; +#endif + + /* request GIF-photo (Photo in X.500 as JPEG) */ + case cGIF: + do_pict( ld, fp, query, 1, glob); + break; + + /* display JPEG-Photo */ + case cJPEG: + do_pict( ld, fp, query, 2, glob); + break; + + /* display X.500-G3FAX-Photo */ + case cG3FAX: + do_pict( ld, fp, query, 0, glob); + break; + + /* play Audio-attribute */ + case cAUDIO: + do_audio( ld, fp, query, 0, glob); + break; + + /* eXtended query format */ + case cEXTENDED: + do_xtend( ld, fp, query, 0, glob); + break; + + /* Default (empty query) is browsing of BASEDN */ + default: + do_menu( ld, fp, glob->basedn->dn, "", glob ); + break; + } + + /* Job done, terminate connection to the DSA and bye! */ + ldap_unbind (ld); + close_ldap_connections(glob); + rewind(fp); + exit_tweb( 0 ); + /* NOT REACHED */ +} +/* end of function: do_queries */ + +PUBLIC void timeoutf(sig) +int sig; +{ + /* fprintf(stderr, "timeout!"); */ + exit_tweb(0); +} +/* end of function: timeoutf */ + + +PRIVATE void strict_basednf(fp, ld, query, glob) +FILE *fp; +LDAP *ld; +char *query; +GLOB_STRUCT *glob; +{ + char dnbuf[BUFSIZ], basednbuf[BUFSIZ], *strptr; + LDAPMessage *res, *e; + int rc, flag = 0, i, j; + struct timeval timeout; + char *url = NULL, **uri, *urlnola = NULL; + pGW_SWITCH_LINE gw_ptr; + char *url_tmp; + char **dnarray, **bdnarray; + +#ifdef TUE_TEL + /* Patch for TONS */ + if( glob->ton_urls && (*query == cTON)) + return; +#endif + + /* Patch for FORMs/PULLDOWNs (cPULLDOWN) */ + if( glob->pull_down_menus && (*query == cPULLDOWN)) + return; + + /* Patch for FORMs/BUTTONs (cBUTTONs) */ + if( glob->pull_down_menus && (*query == cBUTTON)) + return; + + if(*query) + strcpy(dnbuf, query+1); + else + strcpy(dnbuf, "\0"); + hex_decode(dnbuf); + strcpy(basednbuf, glob->basedn->dn); + + if( ( strptr = strchr(dnbuf, '?')) ) + *strptr = '\0'; + + if( *query && !dn_issuffix( dn_normalize(dnbuf), dn_normalize(basednbuf))) { + + dnarray = dn2charray(dnbuf); + bdnarray = glob->basedn->dnarray; + + strcpy(dnbuf, "\0"); + if (glob->gw_switch) { + for(gw_ptr = glob->gw_switch->list; + !flag && gw_ptr; gw_ptr = gw_ptr->next) { + if (!dn_cmp ("root", gw_ptr->dn)) { + flag = 1; + url = gw_ptr->url; + } + } + } + if(!flag) { + fprintf(stderr, "Fehler:strict_basedn w/o root-switch!!!!\n"); + exit_tweb(0); + } + + for(j=0; bdnarray[j] && dnarray[j]; j++) { + char *dnbufb; + + flag = 0; + + dnbufb = strdup(dnbuf); + sprintf(dnbuf, "%s%s%s", dnarray[j], *dnbuf ? "," : "" , dnbufb); + + if ( glob->gw_switch && glob->gw_switch->dynamic) { + + if ( (rc=ldap_simple_bind_s( ld, glob->webdn, glob->webpw )) + != LDAP_SUCCESS ) { + if ( debug ) ldap_perror( ld, "ldap_simple_bind_s" ); + do_error( fp, rc, SERVER_ERROR, glob); + rewind(fp); + exit_tweb( 1 ); + } + + timeout.tv_sec = glob->timeout; + timeout.tv_usec = 0; + + if ( (rc = ldap_search_st( ld, dnbuf, LDAP_SCOPE_BASE, "objectClass=*", + NULL, 0, &timeout, &res )) != LDAP_SUCCESS ) { +/* do_error(fp, rc, NOT_FOUND, glob); +*/ + continue; + } + + + if ( (e = ldap_first_entry( ld, res )) == NULL ) { + do_error(fp, -2, SERVER_ERROR, glob); + return; + } + + + uri = ldap_get_values( ld, e, "labeledURI" ); + for(i=0; uri && uri[i] && *uri[i]; i++) { + char *sp; + + if( ( sp = strchr(uri[i], ' ')) ) { + *sp++ = '\0'; + if(strstr(sp, glob->gw_switch->lagws)) { + flag = 1; + url = uri[i]; + break; + } else if(strstr(sp, GWS)) + urlnola = uri[i]; + } + } + } + if(!flag && urlnola) { + url = urlnola; + flag = 1; + } + if (glob->gw_switch) { + + for(gw_ptr = glob->gw_switch->list; + !flag && gw_ptr; gw_ptr = gw_ptr->next) { + if (!dn_cmp (dnbuf, gw_ptr->dn)) { + flag = 1; + url = gw_ptr->url; + } + } + } + if(strcmp(bdnarray[j], dnarray[j])) + break; + } + + if (http == 1) PRINT_HTML_HEADER; + fprintf( fp, HTML_HEAD_TITLE, "ACCESS DENIED", glob->la[100]); + disp_file(glob, glob->header, fp); + fprintf( fp, "%s\n", glob->la[96]); + url_tmp = strdup(url_complete(url, query, "")); + fprintf( fp, "<P><A HREF=\"%s\"><b>%s</b></A>\n", + url_tmp, url_tmp); + disp_file(glob, glob->footer, fp); + PRINT_HTML_FOOTER; + ldap_unbind (ld); + close_ldap_connections(glob); + exit_tweb(0); + } +} +/* end of function: strict_basednf */ + +PRIVATE void trade_cache(fp, ld, query, glob) +FILE *fp; +LDAP *ld; +char *query; +GLOB_STRUCT *glob; +{ + pCACHING_TERMS_LINE ca_ptr; + char dnbuf[BUFSIZ], rdn[BUFSIZ], *strptr; + char tstring[100]; + int resflag; + int rc; + struct timeval timeout; + LDAPMessage *res, *e; + char **vals = NULL; + + resflag = 0; + if(*query) + strcpy(dnbuf, query+1); + else + strcpy(dnbuf, glob->basedn->dn); + hex_decode(dnbuf); + if( ( strptr = strchr(dnbuf, '?')) ) + *strptr = '\0'; + strcpy(rdn, dnbuf); + if( ( strptr = strQuoteChr(rdn, ',')) ) + *strptr = '\0'; + + for(ca_ptr = glob->caching_terms; ca_ptr; ca_ptr = ca_ptr->next) { + if((toupper(*query) == toupper(*ca_ptr->access_type)) || + ( !*query && (toupper(*ca_ptr->access_type) == 'M'))) { + + if(ca_ptr->rdn_oc && (strstr(str_tolower(rdn), ca_ptr->pattern) || + (*ca_ptr->pattern == '*'))) { + time(&glob->expiretime); + glob->expiretime += ca_ptr->time; + free(glob->expiretimestr); + strftime(tstring, 99, GMT_FORMAT2, gmtime(&glob->expiretime)); + glob->expiretimestr = strdup(tstring); + glob->caching = TRUE; + } + if(!ca_ptr->rdn_oc) { + if(!resflag) { + + if ( (rc=ldap_simple_bind_s( ld, glob->webdn, glob->webpw )) + != LDAP_SUCCESS ) { + if ( debug ) ldap_perror( ld, "ldap_simple_bind_s" ); + do_error( fp, rc, SERVER_ERROR, glob); + rewind(fp); + exit_tweb( 1 ); + } + + timeout.tv_sec = glob->timeout; + timeout.tv_usec = 0; + + if ( (rc = ldap_search_st( ld, dnbuf, LDAP_SCOPE_BASE, "objectClass=*", + NULL, 0, &timeout, &res )) != LDAP_SUCCESS ) { + do_error(fp, rc, NOT_FOUND, glob); + return; + } + + + if ( (e = ldap_first_entry( ld, res )) == NULL ) { + do_error(fp, -2, SERVER_ERROR, glob); + return; + } + + + vals = ldap_get_values( ld, e, "objectClass" ); + resflag = 1; + } + if(charray_inlist( vals, ca_ptr->pattern )) { + time(&glob->expiretime); + glob->expiretime += ca_ptr->time; + free(glob->expiretimestr); + strftime(tstring, 99, GMT_FORMAT2, gmtime(&glob->expiretime)); + glob->expiretimestr = strdup(tstring); + glob->caching = TRUE; + } + } + + } + } + +} +/* end of function: trade_cache */ diff --git a/contrib/tweb/queries.h b/contrib/tweb/queries.h new file mode 100644 index 0000000000000000000000000000000000000000..c5adc3445370c969c9cb6eb17cc558a5c7b84629 --- /dev/null +++ b/contrib/tweb/queries.h @@ -0,0 +1,85 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* queries.h.. * +* * +* Funktion:..WorldWideWeb-X.500-Gateway - Server-Functions * +* Based on web500gw.c 1.3 written by Frank Richter, TU Chemmniz * +* which is based on go500gw by Tim Howes, University of * +* Michigan - All rights reserved * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: : Z D D V V * +* August 16 1995 Z D D V V * +* Last modification: Z D D V V * +* May 10 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: queries.h,v 1.6 1999/09/10 15:01:18 zrnsk01 Exp $ + * + */ + +#ifndef _QUERIES_ +#define _QUERIES_ + +#include "tgeneral.h" +#include "tglobal.h" +#include "init_exp.h" +#include "checkclient_exp.h" +#include "support_exp.h" + +#include "queries_exp.h" +#include "x500_exp.h" +#include "html_exp.h" +#include "server_exp.h" +#include "dn_exp.h" +#include "charray_exp.h" + +#ifdef TUE_TEL +#include "tueTel_exp.h" +#endif + + +/* Macros for request-recognition */ + +/* 1. without DSA */ +#define cHELP 'H' +#define cERROR 'E' +#define cCONFIG 'C' +#define cSTATS 'K' +#define cPULLDOWN 'D' +#define cBUTTON 'B' + +/* 2. with user-bind */ +#define cGETMOD 'F' +#define cDOMOD 'Y' + +/* 3. with GW-bind */ +#define cREAD 'R' +#define cREADALL 'L' +#define cSEARCH 'S' +#define cLIST 'M' +#ifdef TUE_TEL +#define cTON 'T' +#endif +#define cGIF 'I' +#define cJPEG 'J' +#define cG3FAX 'G' +#define cAUDIO 'A' +#define cREFERRAL 'W' +#define cEXTENDED 'X' + +#define GMT_FORMAT "%a, %d %b %Y %T GMT" +#define GMT_FORMAT2 "Expires: %a, %d %b %Y %T GMT\n" +#define ROBOTS_TXT_FILE "robots.txt" + +PRIVATE void strict_basednf(); +PRIVATE void trade_cache(); + +#endif /* _QUERIES_ */ + diff --git a/contrib/tweb/queries_exp.h b/contrib/tweb/queries_exp.h new file mode 100644 index 0000000000000000000000000000000000000000..14dd9a18de6cf07f1034012555c0261a01a29608 --- /dev/null +++ b/contrib/tweb/queries_exp.h @@ -0,0 +1,33 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* queries_exp.h * +* * +* Function:..File for TWEB-SOFTWARE * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* February 13 1996 Z D D V V * +* Last modification: Z D D V V * +* November 21 1996 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: queries_exp.h,v 1.6 1999/09/10 15:01:18 zrnsk01 Exp $ + * + */ + +#ifndef _QUERIES_EXP_ +#define _QUERIES_EXP_ + +PUBLIC void do_queries(/* s, glob , ip_addr, ip_port*/); +PUBLIC void timeoutf(/*sig*/); + + +#endif /* _QUERIES_EXP_ */ diff --git a/contrib/tweb/regular.c b/contrib/tweb/regular.c new file mode 100644 index 0000000000000000000000000000000000000000..3c16d2a98d53012f6e130cfb17371fff0bda6546 --- /dev/null +++ b/contrib/tweb/regular.c @@ -0,0 +1,1211 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* regular.c.. * +* * +* Function:..Routine for TWEB -> regular expressions * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* January 20 1998 Z D D V V * +* Last modification: Z D D V V * +* December 31 1998 ZZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ +/* + * $Id: regular.c,v 1.6 1999/09/10 15:01:19 zrnsk01 Exp $ + * + */ + + +#include "tgeneral.h" +#include "tglobal.h" +#include "regular_exp.h" +#include "regular.h" +#include "support_exp.h" + + +PUBLIC void tweb_regerror(s) +char *s; +{ +#ifdef ERRAVAIL + error("regexp: %s", s); +#else +/* fprintf(stderr, "regexp(3): %s", s); + exit(1); +*/ + /* TWEB: error-logging by syslog */ + if (dosyslog) syslog (LOG_INFO, + "ALLOW/DENY/GRANT/REFUSE - regexp-error: %s", s); + exit_tweb( 1 ); +#endif + /* NOTREACHED */ +} +/* + * tweb_regsub + * + * Copyright (c) 1986 by University of Toronto. + * Written by Henry Spencer. Not derived from licensed software. + * + * Permission is granted to anyone to use this software for any + * purpose on any computer system, and to redistribute it freely, + * subject to the following restrictions: + * + * 1. The author is not responsible for the consequences of use of + * this software, no matter how awful, even if they arise + * from defects in it. + * + * 2. The origin of this software must not be misrepresented, either + * by explicit claim or by omission. + * + * 3. Altered versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + */ + +#ifndef CHARBITS +#define UCHARAT(p) ((int)*(unsigned char *)(p)) +#else +#define UCHARAT(p) ((int)*(p)&CHARBITS) +#endif + +/* + - tweb_regsub - perform substitutions after a regexp match + */ +PUBLIC void tweb_regsub(prog, source, dest) +regexp *prog; +char *source; +char *dest; +{ + register char *src; + register char *dst; + register char c; + register int no; + register int len; + extern char *strncpy(); + + if (prog == NULL || source == NULL || dest == NULL) { + tweb_regerror("NULL parm to tweb_regsub"); + return; + } + if (UCHARAT(prog->program) != MAGIC) { + tweb_regerror("damaged regexp fed to tweb_regsub"); + return; + } + + src = source; + dst = dest; + while ((c = *src++) != '\0') { + if (c == '&') + no = 0; + else if (c == '\\' && '0' <= *src && *src <= '9') + no = *src++ - '0'; + else + no = -1; + + if (no < 0) { /* Ordinary character. */ + if (c == '\\' && (*src == '\\' || *src == '&')) + c = *src++; + *dst++ = c; + } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) { + len = prog->endp[no] - prog->startp[no]; + (void) strncpy(dst, prog->startp[no], len); + dst += len; + if (len != 0 && *(dst-1) == '\0') { /* strncpy hit NUL. */ + tweb_regerror("damaged match string"); + return; + } + } + } + *dst++ = '\0'; +} +/* + * tweb_regcomp and tweb_regexec -- tweb_regsub and tweb_regerror are elsewhere + * + * Copyright (c) 1986 by University of Toronto. + * Written by Henry Spencer. Not derived from licensed software. + * + * Permission is granted to anyone to use this software for any + * purpose on any computer system, and to redistribute it freely, + * subject to the following restrictions: + * + * 1. The author is not responsible for the consequences of use of + * this software, no matter how awful, even if they arise + * from defects in it. + * + * 2. The origin of this software must not be misrepresented, either + * by explicit claim or by omission. + * + * 3. Altered versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * Beware that some of this code is subtly aware of the way operator + * precedence is structured in regular expressions. Serious changes in + * regular-expression syntax might require a total rethink. + */ + +/* + * The "internal use only" fields in regexp.h are present to pass info from + * compile to execute that permits the execute phase to run lots faster on + * simple cases. They are: + * + * regstart char that must begin a match; '\0' if none obvious + * reganch is the match anchored (at beginning-of-line only)? + * regmust string (pointer into program) that match must include, or NULL + * regmlen length of regmust string + * + * Regstart and reganch permit very fast decisions on suitable starting points + * for a match, cutting down the work a lot. Regmust permits fast rejection + * of lines that cannot possibly match. The regmust tests are costly enough + * that tweb_regcomp() supplies a regmust only if the r.e. contains something + * potentially expensive (at present, the only such thing detected is * or + + * at the start of the r.e., which can involve a lot of backup). Regmlen is + * supplied because the test in tweb_regexec() needs it and tweb_regcomp() is computing + * it anyway. + */ + +/* + * Structure for regexp "program". This is essentially a linear encoding + * of a nondeterministic finite-state machine (aka syntax charts or + * "railroad normal form" in parsing technology). Each node is an opcode + * plus a "next" pointer, possibly plus an operand. "Next" pointers of + * all nodes except BRANCH implement concatenation; a "next" pointer with + * a BRANCH on both ends of it is connecting two alternatives. (Here we + * have one of the subtle syntax dependencies: an individual BRANCH (as + * opposed to a collection of them) is never concatenated with anything + * because of operator precedence.) The operand of some types of node is + * a literal string; for others, it is a node leading into a sub-FSM. In + * particular, the operand of a BRANCH node is the first node of the branch. + * (NB this is *not* a tree structure: the tail of the branch connects + * to the thing following the set of BRANCHes.) The opcodes are: + */ +/*#include "regular.h"*/ + +/* + - tweb_regcomp - compile a regular expression into internal code +e* + * We can't allocate space until we know how big the compiled form will be, + * but we can't compile it (and thus know how big it is) until we've got a + * place to put the code. So we cheat: we compile it twice, once with code + * generation turned off and size counting turned on, and once "for real". + * This also means that we don't allocate space until we are sure that the + * thing really will compile successfully, and we never have to move the + * code and thus invalidate pointers into it. (Note that it has to be in + * one piece because free() must be able to free it all.) + * + * Beware that the optimization-preparation code in here knows about some + * of the structure of the compiled regexp. + */ +PUBLIC regexp * tweb_regcomp(exp) +char *exp; +{ + register regexp *r; + register char *scan; + register char *longest; + register int len; + int flags; + + if (exp == NULL) + FAIL("NULL argument"); + + /* First pass: determine size, legality. */ + regparse = exp; + regnpar = 1; + regsize = 0L; + regcode = ®dummy; + tweb_regc(MAGIC); + if (tweb_reg(0, &flags) == NULL) + return(NULL); + + /* Small enough for pointer-storage convention? */ + if (regsize >= 32767L) /* Probably could be 65535L. */ + FAIL("regexp too big"); + + /* Allocate space. */ + r = (regexp *)malloc(sizeof(regexp) + (unsigned)regsize); + if (r == NULL) + FAIL("out of space"); + + /* Second pass: emit code. */ + regparse = exp; + regnpar = 1; + regcode = r->program; + tweb_regc(MAGIC); + if (tweb_reg(0, &flags) == NULL) + return(NULL); + + /* Dig out information for optimizations. */ + r->regstart = '\0'; /* Worst-case defaults. */ + r->reganch = 0; + r->regmust = NULL; + r->regmlen = 0; + scan = r->program+1; /* First BRANCH. */ + if (OP(tweb_regnext(scan)) == END) { /* Only one top-level choice. */ + scan = OPERAND(scan); + + /* Starting-point info. */ + if (OP(scan) == EXACTLY) + r->regstart = *OPERAND(scan); + else if (OP(scan) == BOL) + r->reganch++; + + /* + * If there's something expensive in the r.e., find the + * longest literal string that must appear and make it the + * regmust. Resolve ties in favor of later strings, since + * the regstart check works with the beginning of the r.e. + * and avoiding duplication strengthens checking. Not a + * strong reason, but sufficient in the absence of others. + */ + if (flags&SPSTART) { + longest = NULL; + len = 0; + for (; scan != NULL; scan = tweb_regnext(scan)) + if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) { + longest = OPERAND(scan); + len = strlen(OPERAND(scan)); + } + r->regmust = longest; + r->regmlen = len; + } + } + + return(r); +} + +/* + - reg - regular expression, i.e. main body or parenthesized thing + * + * Caller must absorb opening parenthesis. + * + * Combining parenthesis handling with the base level of regular expression + * is a trifle forced, but the need to tie the tails of the branches to what + * follows makes it hard to avoid. + */ +PRIVATE char * tweb_reg(paren, flagp) +int paren; /* Parenthesized? */ +int *flagp; +{ + register char *ret; + register char *br; + register char *ender; + register int parno = 0; + int flags; + + *flagp = HASWIDTH; /* Tentatively. */ + + /* Make an OPEN node, if parenthesized. */ + if (paren) { + if (regnpar >= NSUBEXP) + FAIL("too many ()"); + parno = regnpar; + regnpar++; + ret = tweb_regnode(OPEN+parno); + } else + ret = NULL; + + /* Pick up the branches, linking them together. */ + br = tweb_regbranch(&flags); + if (br == NULL) + return(NULL); + if (ret != NULL) + tweb_regtail(ret, br); /* OPEN -> first. */ + else + ret = br; + if (!(flags&HASWIDTH)) + *flagp &= ~HASWIDTH; + *flagp |= flags&SPSTART; + while (*regparse == '|') { + regparse++; + br = tweb_regbranch(&flags); + if (br == NULL) + return(NULL); + tweb_regtail(ret, br); /* BRANCH -> BRANCH. */ + if (!(flags&HASWIDTH)) + *flagp &= ~HASWIDTH; + *flagp |= flags&SPSTART; + } + + /* Make a closing node, and hook it on the end. */ + ender = tweb_regnode((paren) ? CLOSE+parno : END); + tweb_regtail(ret, ender); + + /* Hook the tails of the branches to the closing node. */ + for (br = ret; br != NULL; br = tweb_regnext(br)) + tweb_regoptail(br, ender); + + /* Check for proper termination. */ + if (paren && *regparse++ != ')') { + FAIL("unmatched ()"); + } else if (!paren && *regparse != '\0') { + if (*regparse == ')') { + FAIL("unmatched ()"); + } else + FAIL("junk on end"); /* "Can't happen". */ + /* NOTREACHED */ + } + + return(ret); +} + +/* + - tweb_regbranch - one alternative of an | operator + * + * Implements the concatenation operator. + */ +PRIVATE char * tweb_regbranch(flagp) +int *flagp; +{ + register char *ret; + register char *chain; + register char *latest; + int flags; + + *flagp = WORST; /* Tentatively. */ + + ret = tweb_regnode(BRANCH); + chain = NULL; + while (*regparse != '\0' && *regparse != '|' && *regparse != ')') { + latest = tweb_regpiece(&flags); + if (latest == NULL) + return(NULL); + *flagp |= flags&HASWIDTH; + if (chain == NULL) /* First piece. */ + *flagp |= flags&SPSTART; + else + tweb_regtail(chain, latest); + chain = latest; + } + if (chain == NULL) /* Loop ran zero times. */ + (void) tweb_regnode(NOTHING); + + return(ret); +} + +/* + - tweb_regpiece - something followed by possible [*+?] + * + * Note that the branching code sequences used for ? and the general cases + * of * and + are somewhat optimized: they use the same NOTHING node as + * both the endmarker for their branch list and the body of the last branch. + * It might seem that this node could be dispensed with entirely, but the + * endmarker role is not redundant. + */ +PRIVATE char * tweb_regpiece(flagp) +int *flagp; +{ + register char *ret; + register char op; + register char *next; + int flags; + + ret = tweb_regatom(&flags); + if (ret == NULL) + return(NULL); + + op = *regparse; + if (!ISMULT(op)) { + *flagp = flags; + return(ret); + } + + if (!(flags&HASWIDTH) && op != '?') + FAIL("*+ operand could be empty"); + *flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH); + + if (op == '*' && (flags&SIMPLE)) + tweb_reginsert(STAR, ret); + else if (op == '*') { + /* Emit x* as (x&|), where & means "self". */ + tweb_reginsert(BRANCH, ret); /* Either x */ + tweb_regoptail(ret, tweb_regnode(BACK)); /* and loop */ + tweb_regoptail(ret, ret); /* back */ + tweb_regtail(ret, tweb_regnode(BRANCH)); /* or */ + tweb_regtail(ret, tweb_regnode(NOTHING)); /* null. */ + } else if (op == '+' && (flags&SIMPLE)) + tweb_reginsert(PLUS, ret); + else if (op == '+') { + /* Emit x+ as x(&|), where & means "self". */ + next = tweb_regnode(BRANCH); /* Either */ + tweb_regtail(ret, next); + tweb_regtail(tweb_regnode(BACK), ret); /* loop back */ + tweb_regtail(next, tweb_regnode(BRANCH)); /* or */ + tweb_regtail(ret, tweb_regnode(NOTHING)); /* null. */ + } else if (op == '?') { + /* Emit x? as (x|) */ + tweb_reginsert(BRANCH, ret); /* Either x */ + tweb_regtail(ret, tweb_regnode(BRANCH)); /* or */ + next = tweb_regnode(NOTHING); /* null. */ + tweb_regtail(ret, next); + tweb_regoptail(ret, next); + } + regparse++; + if (ISMULT(*regparse)) + FAIL("nested *?+"); + + return(ret); +} + +/* + - tweb_regatom - the lowest level + * + * Optimization: gobbles an entire sequence of ordinary characters so that + * it can turn them into a single node, which is smaller to store and + * faster to run. Backslashed characters are exceptions, each becoming a + * separate node; the code is simpler that way and it's not worth fixing. + */ +PRIVATE char * tweb_regatom(flagp) +int *flagp; +{ + register char *ret; + int flags; + + *flagp = WORST; /* Tentatively. */ + + switch (*regparse++) { + case '^': + ret = tweb_regnode(BOL); + break; + case '$': + ret = tweb_regnode(EOL); + break; + case '.': + ret = tweb_regnode(ANY); + *flagp |= HASWIDTH|SIMPLE; + break; + case '[': { + register int class; + register int classend; + + if (*regparse == '^') { /* Complement of range. */ + ret = tweb_regnode(ANYBUT); + regparse++; + } else + ret = tweb_regnode(ANYOF); + if (*regparse == ']' || *regparse == '-') + tweb_regc(*regparse++); + while (*regparse != '\0' && *regparse != ']') { + if (*regparse == '-') { + regparse++; + if (*regparse == ']' || *regparse == '\0') + tweb_regc('-'); + else { + class = UCHARAT(regparse-2)+1; + classend = UCHARAT(regparse); + if (class > classend+1) + FAIL("invalid [] range"); + for (; class <= classend; class++) + tweb_regc(class); + regparse++; + } + } else + tweb_regc(*regparse++); + } + tweb_regc('\0'); + if (*regparse != ']') + FAIL("unmatched []"); + regparse++; + *flagp |= HASWIDTH|SIMPLE; + } + break; + case '(': + ret = tweb_reg(1, &flags); + if (ret == NULL) + return(NULL); + *flagp |= flags&(HASWIDTH|SPSTART); + break; + case '\0': + case '|': + case ')': + FAIL("internal urp"); /* Supposed to be caught earlier. */ + break; + case '?': + case '+': + case '*': + FAIL("?+* follows nothing"); + break; + case '\\': + if (*regparse == '\0') + FAIL("trailing \\"); + ret = tweb_regnode(EXACTLY); + tweb_regc(*regparse++); + tweb_regc('\0'); + *flagp |= HASWIDTH|SIMPLE; + break; + default: { + register int len; + register char ender; + + regparse--; + len = strcspn(regparse, META); + if (len <= 0) + FAIL("internal disaster"); + ender = *(regparse+len); + if (len > 1 && ISMULT(ender)) + len--; /* Back off clear of ?+* operand. */ + *flagp |= HASWIDTH; + if (len == 1) + *flagp |= SIMPLE; + ret = tweb_regnode(EXACTLY); + while (len > 0) { + tweb_regc(*regparse++); + len--; + } + tweb_regc('\0'); + } + break; + } + + return(ret); +} + +/* + - tweb_regnode - emit a node + */ +PRIVATE char * tweb_regnode(op) +char op; +{ + register char *ret; + register char *ptr; + + ret = regcode; + if (ret == ®dummy) { + regsize += 3; + return(ret); + } + + ptr = ret; + *ptr++ = op; + *ptr++ = '\0'; /* Null "next" pointer. */ + *ptr++ = '\0'; + regcode = ptr; + + return(ret); +} + +/* + - regc - emit (if appropriate) a byte of code + */ +PRIVATE void tweb_regc(b) +char b; +{ + if (regcode != ®dummy) + *regcode++ = b; + else + regsize++; +} + +/* + - tweb_reginsert - insert an operator in front of already-emitted operand + * + * Means relocating the operand. + */ +PRIVATE void tweb_reginsert(op, opnd) +char op; +char *opnd; +{ + register char *src; + register char *dst; + register char *place; + + if (regcode == ®dummy) { + regsize += 3; + return; + } + + src = regcode; + regcode += 3; + dst = regcode; + while (src > opnd) + *--dst = *--src; + + place = opnd; /* Op node, where operand used to be. */ + *place++ = op; + *place++ = '\0'; + *place++ = '\0'; +} + +/* + - tweb_regtail - set the next-pointer at the end of a node chain + */ +PRIVATE void tweb_regtail(p, val) +char *p; +char *val; +{ + register char *scan; + register char *temp; + register int offset; + + if (p == ®dummy) + return; + + /* Find last node. */ + scan = p; + for (;;) { + temp = tweb_regnext(scan); + if (temp == NULL) + break; + scan = temp; + } + + if (OP(scan) == BACK) + offset = scan - val; + else + offset = val - scan; + *(scan+1) = (offset>>8)&0377; + *(scan+2) = offset&0377; +} + +/* + - tweb_regoptail - tweb_regtail on operand of first argument; nop if operandless + */ +PRIVATE void tweb_regoptail(p, val) +char *p; +char *val; +{ + /* "Operandless" and "op != BRANCH" are synonymous in practice. */ + if (p == NULL || p == ®dummy || OP(p) != BRANCH) + return; + tweb_regtail(OPERAND(p), val); +} + +/* + * tweb_regexec and friends + */ + +/* + * Global work variables for tweb_regexec(). + */ +static char *reginput; /* String-input pointer. */ +static char *regbol; /* Beginning of input, for ^ check. */ +static char **regstartp; /* Pointer to startp array. */ +static char **regendp; /* Ditto for endp. */ + +/* + * Forwards. + */ +STATIC int tweb_regtry(); +STATIC int tweb_regmatch(); +STATIC int tweb_regrepeat(); + +#ifdef DEBUG +int regnarrate = 0; +void tweb_regdump(); +STATIC char *tweb_regprop(); +#endif + +/* + - tweb_regexec - match a regexp against a string + */ +int +PUBLIC tweb_regexec(prog, string) +register regexp *prog; +register char *string; +{ + register char *s; + extern char *strchr(); + + /* Be paranoid... */ + if (prog == NULL || string == NULL) { + tweb_regerror("NULL parameter"); + return(0); + } + + /* Check validity of program. */ + if (UCHARAT(prog->program) != MAGIC) { + tweb_regerror("corrupted program"); + return(0); + } + + /* If there is a "must appear" string, look for it. */ + if (prog->regmust != NULL) { + s = string; + while ((s = strchr(s, prog->regmust[0])) != NULL) { + if (strncmp(s, prog->regmust, prog->regmlen) == 0) + break; /* Found it. */ + s++; + } + if (s == NULL) /* Not present. */ + return(0); + } + + /* Mark beginning of line for ^ . */ + regbol = string; + + /* Simplest case: anchored match need be tried only once. */ + if (prog->reganch) + return(tweb_regtry(prog, string)); + + /* Messy cases: unanchored match. */ + s = string; + if (prog->regstart != '\0') + /* We know what char it must start with. */ + while ((s = strchr(s, prog->regstart)) != NULL) { + if (tweb_regtry(prog, s)) + return(1); + s++; + } + else + /* We don't -- general case. */ + do { + if (tweb_regtry(prog, s)) + return(1); + } while (*s++ != '\0'); + + /* Failure. */ + return(0); +} + +/* + - tweb_regtry - try match at specific point + */ +PRIVATE int tweb_regtry(prog, string) +regexp *prog; +char *string; +{ + register int i; + register char **sp; + register char **ep; + + reginput = string; + regstartp = prog->startp; + regendp = prog->endp; + + sp = prog->startp; + ep = prog->endp; + for (i = NSUBEXP; i > 0; i--) { + *sp++ = NULL; + *ep++ = NULL; + } + if (tweb_regmatch(prog->program + 1)) { + prog->startp[0] = string; + prog->endp[0] = reginput; + return(1); + } else + return(0); +} + +/* + - tweb_regmatch - main matching routine + * + * Conceptually the strategy is simple: check to see whether the current + * node matches, call self recursively to see whether the rest matches, + * and then act accordingly. In practice we make some effort to avoid + * recursion, in particular by going through "ordinary" nodes (that don't + * need to know whether the rest of the match failed) by a loop instead of + * by recursion. + */ +PRIVATE int tweb_regmatch(prog) +char *prog; +{ + register char *scan; /* Current node. */ + char *next; /* Next node. */ + extern char *strchr(); + + scan = prog; +#ifdef DEBUG + if (scan != NULL && regnarrate) + fprintf(stderr, "%s(\n", tweb_regprop(scan)); +#endif + while (scan != NULL) { +#ifdef DEBUG + if (regnarrate) + fprintf(stderr, "%s...\n", tweb_regprop(scan)); +#endif + next = tweb_regnext(scan); + + switch (OP(scan)) { + case BOL: + if (reginput != regbol) + return(0); + break; + case EOL: + if (*reginput != '\0') + return(0); + break; + case ANY: + if (*reginput == '\0') + return(0); + reginput++; + break; + case EXACTLY: { + register int len; + register char *opnd; + + opnd = OPERAND(scan); + /* Inline the first character, for speed. */ + if (*opnd != *reginput) + return(0); + len = strlen(opnd); + if (len > 1 && strncmp(opnd, reginput, len) != 0) + return(0); + reginput += len; + } + break; + case ANYOF: + if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) == NULL) + return(0); + reginput++; + break; + case ANYBUT: + if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) != NULL) + return(0); + reginput++; + break; + case NOTHING: + break; + case BACK: + break; + case OPEN+1: + case OPEN+2: + case OPEN+3: + case OPEN+4: + case OPEN+5: + case OPEN+6: + case OPEN+7: + case OPEN+8: + case OPEN+9: { + register int no; + register char *save; + + no = OP(scan) - OPEN; + save = reginput; + + if (tweb_regmatch(next)) { + /* + * Don't set startp if some later + * invocation of the same parentheses + * already has. + */ + if (regstartp[no] == NULL) + regstartp[no] = save; + return(1); + } else + return(0); + } + break; + case CLOSE+1: + case CLOSE+2: + case CLOSE+3: + case CLOSE+4: + case CLOSE+5: + case CLOSE+6: + case CLOSE+7: + case CLOSE+8: + case CLOSE+9: { + register int no; + register char *save; + + no = OP(scan) - CLOSE; + save = reginput; + + if (tweb_regmatch(next)) { + /* + * Don't set endp if some later + * invocation of the same parentheses + * already has. + */ + if (regendp[no] == NULL) + regendp[no] = save; + return(1); + } else + return(0); + } + break; + case BRANCH: { + register char *save; + + if (OP(next) != BRANCH) /* No choice. */ + next = OPERAND(scan); /* Avoid recursion. */ + else { + do { + save = reginput; + if (tweb_regmatch(OPERAND(scan))) + return(1); + reginput = save; + scan = tweb_regnext(scan); + } while (scan != NULL && OP(scan) == BRANCH); + return(0); + /* NOTREACHED */ + } + } + break; + case STAR: + case PLUS: { + register char nextch; + register int no; + register char *save; + register int min; + + /* + * Lookahead to avoid useless match attempts + * when we know what character comes next. + */ + nextch = '\0'; + if (OP(next) == EXACTLY) + nextch = *OPERAND(next); + min = (OP(scan) == STAR) ? 0 : 1; + save = reginput; + no = tweb_regrepeat(OPERAND(scan)); + while (no >= min) { + /* If it could work, try it. */ + if (nextch == '\0' || *reginput == nextch) + if (tweb_regmatch(next)) + return(1); + /* Couldn't or didn't -- back up. */ + no--; + reginput = save + no; + } + return(0); + } + break; + case END: + return(1); /* Success! */ + break; + default: + tweb_regerror("memory corruption"); + return(0); + break; + } + + scan = next; + } + + /* + * We get here only if there's trouble -- normally "case END" is + * the terminating point. + */ + tweb_regerror("corrupted pointers"); + return(0); +} + +/* + - tweb_regrepeat - repeatedly match something simple, report how many + */ +PRIVATE int tweb_regrepeat(p) +char *p; +{ + register int count = 0; + register char *scan; + register char *opnd; + extern char *strchr(); + + scan = reginput; + opnd = OPERAND(p); + switch (OP(p)) { + case ANY: + count = strlen(scan); + scan += count; + break; + case EXACTLY: + while (*opnd == *scan) { + count++; + scan++; + } + break; + case ANYOF: + while (*scan != '\0' && strchr(opnd, *scan) != NULL) { + count++; + scan++; + } + break; + case ANYBUT: + while (*scan != '\0' && strchr(opnd, *scan) == NULL) { + count++; + scan++; + } + break; + default: /* Oh dear. Called inappropriately. */ + tweb_regerror("internal foulup"); + count = 0; /* Best compromise. */ + break; + } + reginput = scan; + + return(count); +} + +/* + - tweb_regnext - dig the "next" pointer out of a node + */ +PRIVATE char * tweb_regnext(p) +register char *p; +{ + register int offset; + + if (p == ®dummy) + return(NULL); + + offset = NEXT(p); + if (offset == 0) + return(NULL); + + if (OP(p) == BACK) + return(p-offset); + else + return(p+offset); +} + +#ifdef DEBUG + +PRIVATE char *tweb_regprop(); + +/* + - tweb_regdump - dump a regexp onto stdout in vaguely comprehensible form + */ +PUBLIC void tweb_regdump(r) +regexp *r; +{ + register char *s; + register char op = EXACTLY; /* Arbitrary non-END op. */ + register char *next; + extern char *strchr(); + + + s = r->program + 1; + while (op != END) { /* While that wasn't END last time... */ + op = OP(s); + printf("%2d%s", s-r->program, tweb_regprop(s)); /* Where, what. */ + next = tweb_regnext(s); + if (next == NULL) /* Next ptr. */ + printf("(0)"); + else + printf("(%d)", (s-r->program)+(next-s)); + s += 3; + if (op == ANYOF || op == ANYBUT || op == EXACTLY) { + /* Literal string, where present. */ + while (*s != '\0') { + putchar(*s); + s++; + } + s++; + } + putchar('\n'); + } + + /* Header fields of interest. */ + if (r->regstart != '\0') + printf("start `%c' ", r->regstart); + if (r->reganch) + printf("anchored "); + if (r->regmust != NULL) + printf("must have \"%s\"", r->regmust); + printf("\n"); +} + +/* + - tweb_regprop - printable representation of opcode + */ +PRIVATE char * tweb_regprop(op) +char *op; +{ + register char *p; + static char buf[50]; + + (void) strcpy(buf, ":"); + + switch (OP(op)) { + case BOL: + p = "BOL"; + break; + case EOL: + p = "EOL"; + break; + case ANY: + p = "ANY"; + break; + case ANYOF: + p = "ANYOF"; + break; + case ANYBUT: + p = "ANYBUT"; + break; + case BRANCH: + p = "BRANCH"; + break; + case EXACTLY: + p = "EXACTLY"; + break; + case NOTHING: + p = "NOTHING"; + break; + case BACK: + p = "BACK"; + break; + case END: + p = "END"; + break; + case OPEN+1: + case OPEN+2: + case OPEN+3: + case OPEN+4: + case OPEN+5: + case OPEN+6: + case OPEN+7: + case OPEN+8: + case OPEN+9: + sprintf(buf+strlen(buf), "OPEN%d", OP(op)-OPEN); + p = NULL; + break; + case CLOSE+1: + case CLOSE+2: + case CLOSE+3: + case CLOSE+4: + case CLOSE+5: + case CLOSE+6: + case CLOSE+7: + case CLOSE+8: + case CLOSE+9: + sprintf(buf+strlen(buf), "CLOSE%d", OP(op)-CLOSE); + p = NULL; + break; + case STAR: + p = "STAR"; + break; + case PLUS: + p = "PLUS"; + break; + default: + tweb_regerror("corrupted opcode"); + break; + } + if (p != NULL) + (void) strcat(buf, p); + return(buf); +} +#endif + +/* + * The following is provided for those people who do not have strcspn() in + * their C libraries. They should get off their butts and do something + * about it; at least one public-domain implementation of those (highly + * useful) string routines has been published on Usenet. + */ +#ifdef strcspn +/* + * strcspn - find length of initial segment of s1 consisting entirely + * of characters not from s2 + */ + +PRIVATE int strcspn(s1, s2) +char *s1; +char *s2; +{ + register char *scan1; + register char *scan2; + register int count; + + count = 0; + for (scan1 = s1; *scan1 != '\0'; scan1++) { + for (scan2 = s2; *scan2 != '\0';) /* ++ moved down. */ + if (*scan1 == *scan2++) + return(count); + count++; + } + return(count); +} +#endif diff --git a/contrib/tweb/regular.h b/contrib/tweb/regular.h new file mode 100644 index 0000000000000000000000000000000000000000..cce8d1c17a010cf9ce3b79201df03a62a3a0b1ec --- /dev/null +++ b/contrib/tweb/regular.h @@ -0,0 +1,137 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* regular.h.. * +* * +* Function:..Routine for TWEB * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* January 20 1998 Z D D V V * +* Last modification: Z D D V V * +* December 31 1998 ZZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ +/* + * $Id: regular.h,v 1.6 1999/09/10 15:01:19 zrnsk01 Exp $ + * + */ + +#ifndef _REGULAR_ +#define _REGULAR_ + + +/* definition number opnd? meaning */ +#define END 0 /* no End of program. */ +#define BOL 1 /* no Match "" at beginning of line. */ +#define EOL 2 /* no Match "" at end of line. */ +#define ANY 3 /* no Match any one character. */ +#define ANYOF 4 /* str Match any character in this string. */ +#define ANYBUT 5 /* str Match any character not in this string. */ +#define BRANCH 6 /* node Match this alternative, or the next... */ +#define BACK 7 /* no Match "", "next" ptr points backward. */ +#define EXACTLY 8 /* str Match this string. */ +#define NOTHING 9 /* no Match empty string. */ +#define STAR 10 /* node Match this (simple) thing 0 or more times. */ +#define PLUS 11 /* node Match this (simple) thing 1 or more times. */ +#define OPEN 20 /* no Mark this point in input as start of #n. */ + /* OPEN+1 is number 1, etc. */ +#define CLOSE ((OPEN)+(NSUBEXP)+1) /* no Analogous to OPEN. */ + +/* + * Opcode notes: + * + * BRANCH The set of branches constituting a single choice are hooked + * together with their "next" pointers, since precedence prevents + * anything being concatenated to any individual branch. The + * "next" pointer of the last BRANCH in a choice points to the + * thing following the whole choice. This is also where the + * final "next" pointer of each individual branch points; each + * branch starts with the operand node of a BRANCH node. + * + * BACK Normal "next" pointers all implicitly point forward; BACK + * exists to make loop structures possible. + * + * STAR,PLUS '?', and complex '*' and '+', are implemented as circular + * BRANCH structures using BACK. Simple cases (one character + * per match) are implemented with STAR and PLUS for speed + * and to minimize recursive plunges. + * + * OPEN,CLOSE ...are numbered at compile time. + */ + +/* + * A node is one char of opcode followed by two chars of "next" pointer. + * "Next" pointers are stored as two 8-bit pieces, high order first. The + * value is a positive offset from the opcode of the node containing it. + * An operand, if any, simply follows the node. (Note that much of the + * code generation knows about this implicit relationship.) + * + * Using two bytes for the "next" pointer is vast overkill for most things, + * but allows patterns to get big without disasters. + */ +#define OP(p) (*(p)) +#define NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377)) +#define OPERAND(p) ((p) + 3) + +/* + * See regmagic.h for one further detail of program structure. + */ + + +/* + * Utility definitions. + */ +#ifndef CHARBITS +#define UCHARAT(p) ((int)*(unsigned char *)(p)) +#else +#define UCHARAT(p) ((int)*(p)&CHARBITS) +#endif + +#define FAIL(m) { tweb_regerror(m); return(NULL); } +#define ISMULT(c) ((c) == '*' || (c) == '+' || (c) == '?') +#define META "^$.[()|?+*\\" + +/* + * Flags to be passed up and down. + */ +#define HASWIDTH 01 /* Known never to match null string. */ +#define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */ +#define SPSTART 04 /* Starts with * or +. */ +#define WORST 0 /* Worst case. */ + +/* + * Global work variables for regcomp(). + */ +PRIVATE char *regparse; /* Input-scan pointer. */ +PRIVATE int regnpar; /* () count. */ +PRIVATE char regdummy; +PRIVATE char *regcode; /* Code-emit pointer; ®dummy = don't. */ +PRIVATE long regsize; /* Code size. */ + +/* + * Forward declarations for regcomp()'s friends. + */ +#ifndef STATIC +#define STATIC static +#endif +PRIVATE char *tweb_reg(); +PRIVATE char *tweb_regbranch(); +PRIVATE char *tweb_regpiece(); +PRIVATE char *tweb_regatom(); +PRIVATE char *tweb_regnode(); +PRIVATE char *tweb_regnext(); +PRIVATE void tweb_regc(); +PRIVATE void tweb_reginsert(); +PRIVATE void tweb_regtail(); +PRIVATE void tweb_regoptail(); +#ifdef STRCSPN +STATIC int tweb_strcspn(); +#endif + +#endif /* _REGULAR_ */ diff --git a/contrib/tweb/regular_exp.h b/contrib/tweb/regular_exp.h new file mode 100644 index 0000000000000000000000000000000000000000..24bb661e4c0bef25c30fa0753ec447edd2cd7017 --- /dev/null +++ b/contrib/tweb/regular_exp.h @@ -0,0 +1,56 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* regular_exp.h * +* * +* Function:..Routine for TWEB * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* January 20 1998 Z D D V V * +* Last modification: Z D D V V * +* January 20 1998 ZZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ +/* + * $Id: regular_exp.h,v 1.6 1999/09/10 15:01:19 zrnsk01 Exp $ + * + */ + + +#ifndef _REGULAR_EXP_ +#define _REGULAR_EXP_ + +/* + * Definitions etc. for regexp(3) routines. + * + * Caveat: this is V8 regexp(3) [actually, a reimplementation thereof], + * not the System V one. + */ +#define NSUBEXP 10 +typedef struct regexp { + char *startp[NSUBEXP]; + char *endp[NSUBEXP]; + char regstart; /* Internal use only. */ + char reganch; /* Internal use only. */ + char *regmust; /* Internal use only. */ + int regmlen; /* Internal use only. */ + char program[1]; /* Unwarranted chumminess with compiler. */ +} regexp; + +extern regexp *tweb_regcomp(); +extern int tweb_regexec(); +extern void tweb_regsub(); +extern void tweb_regerror(); +/* + * The first byte of the regexp internal "program" is actually this magic + * number; the start node begins in the second byte. + */ +#define MAGIC 0234 + +#endif /* _REGULAR_EXP_ */ diff --git a/contrib/tweb/server.c b/contrib/tweb/server.c new file mode 100644 index 0000000000000000000000000000000000000000..a5ebcf52dc8f9b0e298b936c0b067f04431f5ba5 --- /dev/null +++ b/contrib/tweb/server.c @@ -0,0 +1,432 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* server.c... * +* * +* Function:..WorldWideWeb-X.500-Gateway - Server-Funktions * +* Based on web500gw.c 1.3 written by Frank Richter, TU Chemmniz * +* which is based on go500gw by Tim Howes, University of * +* Michigan - All rights reserved * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* August 16 1995 Z D D V V * +* Last modification: Z D D V V * +* May 6 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: server.c,v 1.6 1999/09/10 15:01:19 zrnsk01 Exp $ + * + */ + +#include "tgeneral.h" +#include "tglobal.h" +#include "init_exp.h" +#include "checkclient_exp.h" +#include "server.h" +#include "charray_exp.h" + +#if defined( TUE_TEL ) || defined( AMBIXGW ) +#include "tueTest_exp.h" +#endif + + +/** + ** start_server() + ** + ** Start the Web-X.500-Server. + **/ + +PUBLIC void start_server(glob) +GLOB_STRUCT *glob; +{ + + int s, ns, rc; + int tblsize; + int pid = getpid(); + fd_set readfds; + struct hostent *hp; + struct sockaddr_in from; + int fromlen; + void wait4child(); + long int idx; + + glob->stat_slice = time(&glob->stat_slice); + stat_slice = &glob->stat_slice; + /* if logging is desired via syslog establish connection to syslogd + and write first log-message */ + if ( dosyslog ) { + + openlog( glob->myname, LOG_PID | LOG_NOWAIT, dosyslog ); + syslog( LOG_INFO, "initializing" ); + + } + + /* set up the socket to listen on */ + /* the actual port to listen is composed by the base-port + and the language-offset */ + s = set_socket( glob->webport + atoi(glob->lang) ); + + /* arrange to reap children */ + (void) signal( SIGCHLD, wait4child ); + + if ( dosyslog ) + syslog (LOG_INFO, "socket: %d", s); + + /* Read LDAP-filter for search-operations */ + if ( (filtd = ldap_init_getfilter( glob->filterfile )) == NULL ) { + fprintf(stderr,"Cannot open filter file (%s)\n", glob->filterfile ); + exit( 1 ); + } + +/* ### Code for the static server ### */ + + tblsize = getdtablesize(); + syslog (LOG_INFO, "listening for calls..."); + + /* Initialisation of the Anti-Hack-code */ + srand(pid); + if (glob->comrefuse) hackTimer(); + bzero((char *) conArr, CARRSIZE * sizeof(int)); + bzero((char *) shadowconArr, CARRSIZE * sizeof(long int)); + bzero((char *) sumconArr, CARRSIZE * sizeof(long int)); + +#ifdef TUE_TEL + /* initialisation of dit_config 1st time */ + if(glob->dit_config) { + init_dit_config(); + } +#endif + + /* initialisation of ip_refuse 1st time */ + if(glob->ip_refuse) { + get_ip_refuse_clients(glob); + } + + /* the server runs in an infinite loop !!! */ + for ( ;; ) { + + /* listen on the server-port for incoming connections */ + FD_ZERO( &readfds ); + FD_SET( s, &readfds ); + + if ((rc=select(tblsize,(fd_set *)&readfds,NULL,NULL,0))==-1) { + if ( debug ) perror( "select" ); + continue; + } else if ( rc == 0 ) { + continue; + } + + if ( ! FD_ISSET( s, &readfds ) ) + continue; + + + /* got connection for the server: get data */ + fromlen = sizeof(from); + + /* increment the counter for total connections */ + glob->svc_cnt++; + + /* get new file-descriptors for the connection */ + if ( (ns = accept( s, (struct sockaddr *) &from, &fromlen )) == -1 ) { + + /* new fd could not be assigned -> log & bye */ + if ( debug ) perror( "accept" ); + if ( dosyslog ) { + syslog (LOG_INFO, + "problem with accept, errno=%d, %s <%08d>", + errno, strerror(errno), glob->svc_cnt); + } + continue; + } + + /* get time for performance log */ + gettimeofday(×tore[0], NULL); + + /* get client-address via DNS */ + hp = gethostbyaddr( (char *) &(from.sin_addr.s_addr), + sizeof(from.sin_addr.s_addr), AF_INET ); + + /* check ip-address for ip_refuse and bye if matched */ + if ( check_ip_denial( &from, glob ) == NOTOK ) { + + if ( dosyslog ) + syslog( LOG_INFO, "IP-REFUSE: access denied for %s <%08d>", + inet_ntoa( from.sin_addr ), glob->svc_cnt); + + close (ns); + continue; + + } + + /* get time for performance log */ + gettimeofday(×tore[1], NULL); + + /* Anti-Hack-part */ + + /* divide Host-IP-addresses in index-groups and count connection */ + idx = IP_HACK(from.sin_addr.s_addr); + sumconArr[idx]++; + + /* count try if already locked and bye */ + if(conArr[idx] < 0) { + + shadowconArr[idx]++; + close (ns); + continue; + + } + + /* if not yet locked and maximum amount of connections is exeeded -> + lock & message & bye + */ + if (glob->comrefuse && (++conArr[idx] > glob->comrefuse->maxAccept)){ + + if (dosyslog) + syslog(LOG_INFO, +"connection refused for %s (IDX=%d): %d attempts, %d cycles suspended <%08d>", + hp ? hp->h_name : "unknown", idx, conArr[idx], + glob->comrefuse->suspendCycle, glob->svc_cnt); + + /* lock for x timecycles */ + conArr[idx] = glob->comrefuse->suspendCycle; + + /* bye, bye baby */ + close (ns); + continue; + + } + + /* END of Anti-Hack-part */ + + /* Log the connection */ + if ( dosyslog ) { + char msg[BUFSIZ]; + + sprintf(msg, "TCP connection from %s (%s,%u)", + (hp == NULL) ? "unknown" : hp->h_name, + inet_ntoa( from.sin_addr ), from.sin_port ); + glob->server_connection_msg = strdup(msg); + } + + if ( debug ) { + fprintf( stderr, "connection from %s (%s)\n", + (hp == NULL) ? "unknown" : hp->h_name, + inet_ntoa( from.sin_addr ) ); + } + + glob->unknown_host = !hp; + + /* OK, now fork a sub-process performing the further communication + to the client; the father-process is listening for further + connections */ + switch( pid = fork() ) { + case 0: /* child */ + + /* the connection to the client should last at most OUT_TIME + thereafter terminate connection */ + signal(SIGALRM, timeoutf); + alarm(OUT_TIME); + + /* the s-filedescriptor is not needed any more */ + close( s ); + + /* Serve client-request */ + do_queries( ns, glob , inet_ntoa( from.sin_addr ), from.sin_port, hp); + break; + + case -1: /* failed */ + if (dosyslog) + syslog (LOG_INFO, "%s <%08d>", + glob->server_connection_msg, glob->svc_cnt); + perror( "fork" ); + break; + + default: /* parent */ + /* the father-process continues listening */ + close( ns ); + if ( debug ) + fprintf( stderr, "forked child %d\n", pid ); + break; + } + } + /* NOT REACHED */ +} +/* end of function: start_server */ + + +/** + ** set_socket() + ** + ** Initialise socket to listen on and assign dedicated FD + **/ + +PRIVATE int set_socket(port) +int port; +{ + int s, one; + struct sockaddr_in addr; + + if ( (s = socket( AF_INET, SOCK_STREAM, 0 )) == -1 ) { + perror( "socket" ); + exit( 1 ); + } + + /* set option so clients can't keep us from coming back up */ + one = 1; + if ( setsockopt( s, SOL_SOCKET, SO_REUSEADDR, (char *) &one, + sizeof(one) ) < 0 ) { + perror( "setsockopt" ); + exit( 1 ); + } + + /* bind to a name */ + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = INADDR_ANY; + addr.sin_port = htons( port ); + if ( bind( s, (struct sockaddr *) &addr, sizeof(addr) ) ) { + perror( "bind" ); + exit( 1 ); + } + + /* listen for connections */ + if ( listen( s, 512 ) == -1 ) { + perror( "listen" ); + exit( 1 ); + } + + if ( debug ) + printf( "web500gw listening on port %d\n", port ); + + return( s ); +} +/* end of function: set_socket */ + +/* If a sub-daemon exists, remove from Process list */ +PRIVATE void wait4child(arg) +int arg; +{ + int status; + + if ( debug ) printf( "parent: catching child status\n" ); + while ( wait3( &status, WNOHANG | WUNTRACED, 0 ) > 0 ) + ; /* NULL */ + (void) signal( SIGCHLD, wait4child ); +} +/* end of function: wait4child */ + +/* set signal-handler for Anti-Hack */ +PRIVATE void hackTimer() +{ + static time_t timer = (time_t) 0; + time_t now = time (&now); + + /* re-read IP-REFUSE file if necessary */ + re_readIPrefuse( globP ); + + /* re-read INDEX-URL file if necessary */ + re_read_index_url_rules( globP ); + + if (!timer) { + + timer = now + comRefuseP->statCycle; + + } + + signal(SIGALRM, reset_conMem); + alarm((rand() % comRefuseP->tdiff) + comRefuseP->tmin); + + if (now + comRefuseP->tmin > timer) { + + timer = put_hackStats (NULL, now) + comRefuseP->statCycle; + *stat_slice = now; + + } + +} +/* end of function: hackTimer */ + + +/* Signal-handler for Anti-Hack-code */ +PRIVATE void reset_conMem() +{ + int i; + + hackTimer(); + + for(i=0; i< 8192; i++) + if(conArr[i] >= 0) conArr[i] = 0; + else { + if(++conArr[i] == 0){ + if (dosyslog) + syslog(LOG_INFO, "connection accept resumed for IDX=%d; \ +%u connection attempts during suspension <%08d>", i, shadowconArr[i], + globP->svc_cnt); + shadowconArr[i] = 0; + } + } + +} +/* end of function: reset_conMem */ + + +/* regular output of the access-statistic */ +PUBLIC time_t put_hackStats (fp, now) +FILE *fp; +time_t now; +{ + int i, bereiche; + int is_html = (fp != NULL); + char *eol = is_html ? "<BR>\n" : "\n"; + unsigned long int gesamt = 0; + + if (!now) now = time (&now); + + if (!fp) fp = fopen (comRefuseP->statFile, "w"); + + if (fp) { + + if (is_html) fprintf (fp, "<PRE><BR>\n"); + + fprintf (fp, "Access-Statistic TWEB%s", eol); + fprintf (fp, "======================%s", eol); + if (comRefuseP) fprintf (fp, "FILE : %s%s", comRefuseP->statFile, eol); + fprintf (fp, "START: %s%s", format_time (*stat_slice), eol); + fprintf (fp, "END : %s%s%s%s", format_time (now), eol, eol, eol); + + for (i = 0, bereiche = 0; i < CARRSIZE; i++) { + + if(sumconArr[i]) { + fprintf (fp, "IP-IDX %5d: %8lu%s", i, sumconArr[i], eol); + gesamt += sumconArr[i]; + bereiche++; + } + + } + if(bereiche > 1) { + fprintf (fp, "----------------------%s", eol); + fprintf (fp, "Total: %8lu ( from %d IP-Ranges )%s", + gesamt, bereiche, eol); + } + + if (is_html) { + + fprintf (fp, "</PRE><BR>\n"); + + } else { + + bzero((char *) sumconArr, CARRSIZE * sizeof(long int)); + fprintf (fp, "\n"); + fclose (fp); + + } + } + + return (now); + +} /* put_hackStats */ diff --git a/contrib/tweb/server.h b/contrib/tweb/server.h new file mode 100644 index 0000000000000000000000000000000000000000..6e1b3fc7ef638bf87172fbf6f8824e299b3281d9 --- /dev/null +++ b/contrib/tweb/server.h @@ -0,0 +1,72 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* server.h... * +* * +* Funktion:..WorldWideWeb-X.500-Gateway - Server-Funktions * +* Based on web500gw.c 1.3 written by Frank Richter, TU Chemmniz * +* which is based on go500gw by Tim Howes, University of * +* Michigan - All rights reserved * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* August 16 1995 Z D D V V * +* Last modification: Z D D V V * +* December 31 1998 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: server.h,v 1.6 1999/09/10 15:01:19 zrnsk01 Exp $ + * + */ + +#ifndef _SERVER_ +#define _SERVER_ + +#include "server_exp.h" +#include "queries_exp.h" +#include "support_exp.h" + +#ifdef TUE_TEL +#include "tueTel_exp.h" +#endif + + +#define CARRSIZE 8192 + +#define MASK_30 0x40000000 +#define MASK_20 0x00100000 +#define MASK_17 0x00020000 +#define MASK_10 0x00000ffc + +#define IP_HACK(x) ((((MASK_30 & (x)) != 0) * 4096) + \ + (((MASK_20 & (x)) != 0) * 2048) + \ + (((MASK_17 & (x)) != 0) * 1024) + \ + ((MASK_10 & (x)) >> 2)) + +/* three integer-arrays to count connections */ +int conArr[CARRSIZE]; +unsigned long int shadowconArr[CARRSIZE]; +unsigned long int sumconArr[CARRSIZE]; + +/* the signal-handler */ +PRIVATE void reset_conMem(); + +/* set the Alarm-Timer */ +PRIVATE void hackTimer(); + +PRIVATE int set_socket(); +PRIVATE void wait4child(); + +/* A pointer to the Anti-Hack-infos in the Glob-structure */ +COMREFUSE *comRefuseP = NULL; +time_t *stat_slice; + + +#endif /* _SERVER_ */ + + diff --git a/contrib/tweb/server_exp.h b/contrib/tweb/server_exp.h new file mode 100644 index 0000000000000000000000000000000000000000..d6bc03760205fd63aad3e06f003c8f0ce25e6712 --- /dev/null +++ b/contrib/tweb/server_exp.h @@ -0,0 +1,36 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* server_exp.h... * +* * +* Function:..WorldWideWeb-X.500-Gateway - Server-Funktions * +* Based on web500gw.c 1.3 written by Frank Richter, TU Chemmniz * +* which is based on go500gw by Tim Howes, University of * +* Michigan - All rights reserved * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* February 2 1996 Z D D V V * +* Last modification: Z D D V V * +* December 31 1996 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: server_exp.h,v 1.6 1999/09/10 15:01:19 zrnsk01 Exp $ + * + */ + +#ifndef _SERVER_EXP_ +#define _SERVER_EXP_ + +/* Statistic Output */ +extern time_t put_hackStats(); +extern void start_server(); + +#endif /* _SERVER_EXP_ */ + + diff --git a/contrib/tweb/strng.c b/contrib/tweb/strng.c new file mode 100644 index 0000000000000000000000000000000000000000..d608bd770c3431758c28872eb9d729470c9224ec --- /dev/null +++ b/contrib/tweb/strng.c @@ -0,0 +1,177 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* strng.c.... * +* * +* Function:..String Handling Functions * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* February 13 1996 Z D D V V * +* Last modification: Z D D V V * +* November 3 1998 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: strng.c,v 1.6 1999/09/10 15:01:19 zrnsk01 Exp $ + * + */ + +#include "strng_exp.h" +#include "tgeneral.h" + +/* + * Convert string to integer by means of a dispatcherlist + * if string is not in the dispatcher -> return default + */ + +PUBLIC int cnvt_str2int (stringVal, dispatcher, defaultVal) +STRDISP_P dispatcher; +int defaultVal; +char *stringVal; +{ + int retVal = defaultVal; + STRDISP_P disp; + + for (disp = dispatcher; disp->stringVal; disp++) { + + if (!strncmp (stringVal, disp->stringVal, disp->abbr)) { + + retVal = disp->intVal; + break; + + } + } + + return (retVal); + +} /* cnvt_str2int */ + + +/* + * Truncate characters at the beginning of a string + */ + +PUBLIC char * trimleft (s, what) +char *s, *what; +{ + + return (s + strspn (s, what)); + +} /* trimleft */ + + +/* + * Truncate characters at the end of a string + */ + +PUBLIC char * trimright (s, what) +char *s, *what; +{ + char *tmp = s + strlen (s) - 1; + + while ((tmp >= s) && strchr (what, *tmp)) *tmp-- = '\0'; + + return (s); + +} /* trimright */ + + +/* + * Truncate characters at the beginning and end of a string + */ + +PUBLIC char * trim (s, what) +char *s, *what; +{ + (void) trimright (s, what); + return (trimleft (s, what)); + +} /* trim */ + + +/* + * Convert a string to lower-case "in place" + * uses tolower() + */ + +PUBLIC char *str_tolower (source) +char *source; +{ + char *target = source; + + for (; *target; target++) *target = tolower (*target); + return (source); + +} /* str_tolower */ + + +/* + * Convert a string to upper-case "in place" + * uses toupper() + */ + +PUBLIC char *str_toupper (source) +char *source; +{ + char *target = source; + + for (; *target; target++){ + *target = toupper (*target); + + /* Patch fuer Umlaute */ + if(*target == 'ä') *target = 'Ä'; + else if(*target == 'ö') *target = 'Ö'; + else if(*target == 'ü') *target = 'Ü'; + } + return (source); + +} /* str_toupper */ + + +/* + * Substitute a character in a string by another + */ + +PUBLIC char *tr1 (source, from, to) +char *source; +char from, to; +{ + char *target = source - 1; + + while ( ( target = strchr( ++target, from )) ) *target = to; + + return (source); + +} /* tr1 */ + + +PUBLIC int chrcnt(string, c) +char *string; +char *c; +{ + int count=0; + + string--; + while( ( string = strpbrk(string+1, c)) ) + count++; + return(count); +} +/* end of function: chrcnt */ + + +PUBLIC int +qSortByString( a, b ) +char **a, **b; +{ + return strcmp( *a, *b ); +} +/* end of function: qSortByString */ + + diff --git a/contrib/tweb/strng_exp.h b/contrib/tweb/strng_exp.h new file mode 100644 index 0000000000000000000000000000000000000000..7509a7e81bc3a03cbcbead5ad95d38b7bf4b682e --- /dev/null +++ b/contrib/tweb/strng_exp.h @@ -0,0 +1,80 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* strng_exp.h * +* * +* Function:..String Handling Functions * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* February 13 1996 Z D D V V * +* Last modification: Z D D V V * +* November 3 1998 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: strng_exp.h,v 1.6 1999/09/10 15:01:19 zrnsk01 Exp $ + * + */ + +#ifndef __STRNG_EXP__ +#define __STRNG_EXP__ + +#include <ctype.h> +#include <stdio.h> +#include <string.h> +#include <time.h> + + + +/* + * Structures for the offered Funktions + */ + +typedef struct _str2intDispatch { + + char *stringVal; + int abbr, + intVal; + + } STRDISP, *STRDISP_P; + + +/* + * The "offered" Funktions + */ + +/* Conversion to upper/lower case in the whole string */ +char *str_tolower (/* char *string */); +char *str_toupper (/* char *string */); + +/* Convert string to integer by means of a dispatcherlist */ +/* if string is not in the dispatcher -> return default */ +int cnvt_str2int (/* string, dispatcher, default */); + +/* Truncate characters at the beginning and end of a string */ +char *trimleft (/* char *s, char *what */); +char *trimright (/* char *s, char *what */); +char *trim (/* char *s, char *what */); + +/* A special WHAT: whitespaces */ +#define WSPACE "\n\r\t " + +/* Substitute a character in a string to another */ +char *tr1 (/* char *source, char from, char to */); + +/* Count the named characters of string2 in string1 */ +int chrcnt (/*String1, String2*/); + + +/* Compare by string values in qsort() */ +int qSortByString (/* char **StringP1, char **StringP2 */); + +#endif + diff --git a/contrib/tweb/support.c b/contrib/tweb/support.c new file mode 100644 index 0000000000000000000000000000000000000000..a5866e0f6a6da225415b5e48297848fecffeac28 --- /dev/null +++ b/contrib/tweb/support.c @@ -0,0 +1,613 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* support.c.. * +* * +* Function:..WorldWideWeb-X.500-Gateway - Supporting Routines * +* Based on web500gw.c 1.3 written by Frank Richter, TU Chemmniz * +* which is based on go500gw by Tim Howes, University of * +* Michigan - All rights reserved * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* August 16 1995 Z D D V V * +* Last modification: Z D D V V * +* September 7 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: support.c,v 1.6 1999/09/10 15:01:20 zrnsk01 Exp $ + * + */ + +#include "tgeneral.h" +#include "tglobal.h" +#include "init_exp.h" +#include "support.h" + +/* + * Utilities for dealing with HTML junk + */ + +char hex[17] = "0123456789abcdef"; +char buffer[1024]; + +PUBLIC char * hex_decode (in) +char *in; +{ + char b, c; + int q = 0; + char *out = in; + + while (*in) { + if (*in == '?') /* start search */ + q = 1; + if (*in == '%') { /* Hex escape */ + in++; + if(!(c = *in++)) break; + b = from_hex(c); + if(!(c = *in++)) break; + *out++ = (b<<4) + from_hex(c); + } else if (q && *in == '+') { + /* '+' is legal in path, in search it's a ' ' */ + *out++ = ' '; + in++; + } else { + *out++ = *in++; + } + } + *out = '\0'; + return (out); +} +/* end of function: hex_decode */ + +/* decode in search (for do_modify) */ + +PUBLIC char * hex_qdecode (in) +char *in; +{ + char b, c; + char *out = in; + + while (*in) { + if (*in == '%') { /* Hex escape */ + in++; + if(!(c = *in++)) break; + b = from_hex(c); + if(!(c = *in++)) break; + *out++ = (b<<4) + from_hex(c); + } else if (*in == '+') { /* we are in search, so: '+' -> ' ' */ + *out++ = ' '; + in++; + } else { + *out++ = *in++; + } + } + *out = '\0'; + return (out); +} +/* end of function: hex_qdecode */ + +PUBLIC char * form_encode (in) +char *in; +{ + char *out = buffer; + + /* bzero(out, 1024); */ + while (*in) { + if (*in == '"' || *in == '>' ) { + *out++ = '\\'; + } + *out++ = *in++; + } + *out = '\0'; + + /* fprintf( stderr, "returning - esc: %s.\n", buffer); */ + return (buffer); +} +/* end of function: form_encode */ + +/* gtime(): the inverse of localtime(). + This routine was supplied by Mike Accetta at CMU many years ago. + */ + +int dmsize[] = { + 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 +}; + +#define dysize(y) \ + (((y) % 4) ? 365 : (((y) % 100) ? 366 : (((y) % 400) ? 365 : 366))) + +#define YEAR(y) ((y) >= 100 ? (y) : (y) + 1900) + +PRIVATE time_t gtime (tm) +struct tm *tm; +{ + register int i, + sec, + mins, + hour, + mday, + mon, + year; + register long result; + + if ((sec = tm -> tm_sec) < 0 || sec > 59 + || (mins = tm -> tm_min) < 0 || mins > 59 + || (hour = tm -> tm_hour) < 0 || hour > 24 + || (mday = tm -> tm_mday) < 1 || mday > 31 + || (mon = tm -> tm_mon + 1) < 1 || mon > 12) + return ((long) -1); + if (hour == 24) { + hour = 0; + mday++; + } + year = YEAR (tm -> tm_year); + result = 0L; + for (i = 1970; i < year; i++) + result += dysize (i); + if (dysize (year) == 366 && mon >= 3) + result++; + while (--mon) + result += dmsize[mon - 1]; + result += mday - 1; + result = 24 * result + hour; + result = 60 * result + mins; + result = 60 * result + sec; + return result; +} +/* end of function: gtime */ + +PUBLIC char * format_date (s, format) +char **s; +char *format; +{ +/* PATCHED by /KSp, 94/04/29 */ + static char date[256]; +/* ^^^^^^ */ +/* END PATCH */ + + struct tm tm, *ntm; + time_t t; + + + tm.tm_year = 10*((*s)[0] - '0') + ((*s)[1] - '0'); + tm.tm_mon = 10*((*s)[2] - '0') + ((*s)[3] - '0') - 1; + tm.tm_mday = 10*((*s)[4] - '0') + ((*s)[5] - '0'); + tm.tm_hour = 10*((*s)[6] - '0') + ((*s)[7] - '0'); + tm.tm_min = 10*((*s)[8] - '0') + ((*s)[9] - '0'); + tm.tm_sec = 10*((*s)[10] - '0') + ((*s)[11] - '0'); + +/* PATCHED for HPUX by /KSp, 94/04/28 */ + + tm.tm_isdst = 0; + +#if !defined(__hpux) && !defined(__linux__) && !defined(__sun) + tm.tm_gmtoff = 0; +#endif + +/* END PATCH */ + + t = gtime(&tm); + ntm = gmtime(&t); + strftime(date, 256, format, ntm); + return (date); +} +/* end of function: format_date */ + +PUBLIC char * friendly_dn (dn, glob) +char *dn; +GLOB_STRUCT *glob; +{ +/* PATCHED BY /KSp, 94/04/29 */ + /* static char fufn[1024], **s; */ +/* ^^^^^^ */ +/* END PATCH */ + +/* Again patched by /KSp, 97/01/25: dynamic mem-allocation */ + char *fufn; + + if ( ( fufn = calloc( 1, BUFSIZ )) ) { + + if (strlen(dn) == 0) { + strcpy( fufn, glob->la[77] ); + } else { + + int i = 0; + char **s; + + s = ldap_explode_dn( dn, 1 ); + while (s[i+1]) { + strcat( fufn, s[i++] ); + strcat( fufn, ", " ); + } + strcat( fufn, ldap_friendly_name( glob->friendlyfile, s[i], &fm )); + } + } + + return (fufn); +} +/* end of function: friendly_dn */ + + +PUBLIC char * format_time (whatTime) +time_t whatTime; +{ + time_t timer; + static char theTime[_TIMEOUT_LEN+1]; + + timer = whatTime ? whatTime : time (&timer); + strftime (theTime, (_TIMEOUT_LEN + 1), _LOG_TIME, localtime (&timer)); + + return (theTime); + +} /* end of function: format_time */ + +PUBLIC char * strQuoteChr(string, c) +char *string; +char c; +{ + char *cPtr; + int inQuote = FALSE; + + cPtr = string; + while(*cPtr) { + if( *cPtr == '\"') + inQuote = ( (inQuote == TRUE) ? FALSE : TRUE ); + if( (*cPtr == c) && (inQuote == FALSE) ) + return(cPtr); + cPtr++; + } + + return(NULL); +} +/* end of function: strQuoteChr */ + +PUBLIC char * strrQuoteChr(string, c) +char *string; +char c; +{ + char *cPtr; + int inQuote = FALSE; + + cPtr = string + strlen(string) - 1; + while(cPtr >= string) { + if( *cPtr == '\"') + inQuote = ( (inQuote == TRUE) ? FALSE : TRUE ); + if( (*cPtr == c) && (inQuote == FALSE) ) + return(cPtr); + cPtr--; + } + + return(NULL); +} +/* end of function: strrQuoteChr */ + + +PUBLIC void disp_file(glob, filename, fp) +GLOB_STRUCT *glob; +char *filename; +FILE *fp; +{ +char buf[4096]; +FILE *fp2; + if(filename && (fp2 = fopen(filename, "r" ))) { + while ( fgets(buf, 4095, fp2) != NULL ) + fprintf( fp, "%s",buf); + fclose(fp2); + } + + /* Copyright-Zeile */ + if(filename == glob->footer || + (glob->basedn && filename == glob->basedn->foot)) + fprintf( fp, glob->la[99],glob->la[101], copyright ); +} +/* end of function: disp_file */ + + +PUBLIC int dn_cmp(dn1, dn2) +char *dn1, *dn2; +{ + do { + while(*dn1 == ' ' || *dn1 == '"') + dn1++; + while(*dn2 == ' ' || *dn2 == '"') + dn2++; + if(!*dn1 && !*dn2) + return(FALSE); /* equality */ + } while(tolower(*dn1++) == tolower(*dn2++)); + return(TRUE); +} +/* end of function: dn_cmp */ + + +/* + * dn_cmp_parts() + * + * comparison of dns by rdn parts. in case of unmatched the part(s) which + * matched can be returned (matched not NULL) + * + * input: + * + * - dn1 (in url format) + * - dn2 ( " ) + * - matched (pointer to dynamically allocatable string, or NULL) + * + * output: + * + * - DN_EQUAL | DN_LESS | DN_GREATER | DN_UNMATCHED (with matched allocated) + */ + +PUBLIC int +dn_cmp_parts( dn1, dn2, matched ) +char *dn1; +char *dn2; +char **matched; +{ + char **dn1arr = dn2charray( dn1 ); + char **dn2arr = dn2charray( dn2 ); + int idx; + int domatch = TRUE; + int result = DN_EQUAL; + + for ( idx = 0; dn1arr[idx] && dn2arr[idx]; idx++ ) { + + if ( strcasecmp( dn1arr[idx], dn2arr[idx] )) { + + domatch = FALSE; + break; + + } + } + + /* what was the result */ + + if ( !domatch ) { + + if ( matched ) { + char buf[BUFSIZ]; + char buf2[BUFSIZ]; + int idx2; + + *buf = '\0'; + + for ( idx2 = 0; idx2 < idx; idx2++ ) { + + strcpy( buf2, buf ); + sprintf( buf, "%s,%s", dn1arr[idx2], buf2 ); + + } + trimright( buf, "," ); + + *matched = strdup( buf ); + + } + + result = DN_UNMATCHED; + + } else if ( dn1arr[idx] ) result = DN_GREATER; + else if ( dn2arr[idx] ) result = DN_LESS; + + charray_free( dn1arr ); charray_free( dn2arr ); + + return( result ); + +} /* dn_cmp_parts */ + + + +/* + * Comparison of substring lists + */ + +PUBLIC int strlstcmp (s1, s2, sep) +char *s1, *s2; +char sep; +{ + int retCode = FALSE; + char *target; + char *source; + char *idx, *idx2; + char tmpChar; + + if ( !s1 || !s2 ) + return( FALSE ); + + target = str_tolower (strdup (s1)); + source = str_tolower (strdup (s2)); + idx = source; + + while (idx && (idx2 = strchr (idx+1, sep))) { + + tmpChar = *(++idx2); *idx2 = '\0'; + if (strstr (target, idx)) { + + retCode = TRUE; + break; + + } + + *(idx2) = tmpChar; + idx = --idx2; + + } + + free (source); + free (target); + return (retCode); + +} +/* end of function: strlstcmp */ + +PUBLIC char *hex_html_encode(string, flag) +char *string; +int flag; /* 0->hex 1->html */ +{ + static char strbuf[10*BUFSIZ]; + char *strptr; + + *strbuf = '\0'; + for(strptr = string; *strptr; strptr++){ + /* 200 a -> ä fuer aouAOU */ + if((flag==1) && (((int)*strptr&255)==200)) { + if(strchr("aouAOU", *(strptr+1))) { + sprintf(strbuf, "%s&%cuml;", strbuf, *++strptr); + continue; + } + } + + /* &#xxx; Handling-Patch */ + if((flag==1) && (((int)*strptr&255)>=160)) { + sprintf(strbuf, "%s&#%d;", strbuf, ((int)*strptr&255)); + continue; + } + /* end Patch */ + + if(!encoding_tbl[(int)*strptr&255][flag]) { + sprintf(strbuf, "%s%c", strbuf, *strptr); + } else { + strcat(strbuf, encoding_tbl[(int)*strptr&255][flag]); + } + } + return(strbuf); +} +/* end of function: hex_html_encode */ + +/* Strips basecount+1 characters of type target at the end of an RDN */ +PUBLIC char *dnrcut(rdn, target, basecount) +char *rdn; +char *target; +int basecount; +{ + static char buf[BUFSIZ]; + char *strptr; + int rdncount, morecount; + + rdncount = chrcnt(rdn, target); + if( (morecount = (rdncount - basecount)) > 0) { + strcpy(buf, rdn); + strptr = buf-1; + while(morecount--) { + strptr = strpbrk(strptr+1, target); + } + *strptr = '\0'; + } else *buf = '\0'; + return(buf); +} +/* end of function: dnrcut */ + +PUBLIC char **dn2charray(dn) +char *dn; +{ + char *dnbuf, *strptr, **a=NULL; + + if ( !dn || !*dn ) { + + a = (char **) ch_calloc( 1, sizeof( char ** )); + return( a ); + + } + + dnbuf = strdup(dn); + do { + strptr = strrQuoteChr(dnbuf, ','); + if(strptr) { + *strptr++ = '\0'; +/* + while(*strptr == ' ') + strptr++; +*/ + strptr = trim( strptr, " " ); + } + charray_add( &a, strptr ? strptr : trim( dnbuf, " " )); + } while(strptr); + free(dnbuf); + return(a); +} +/* end of function: dn2charray */ + + +/* get the parent DN for a given one */ +PUBLIC char * +get_parentDN( dn ) +char *dn; +{ + char **a = NULL; + char tmp[BUFSIZ]; + + a = dn2charray( dn ); + *tmp = *(tmp + 1) = '\0'; + + if ( a ) { + char **rdnH; + + /* we have to re-build the DN beginning at the last array element */ + for ( rdnH = a; *rdnH; rdnH++ ) + ; + + /* re-build DN from it's parts */ + rdnH--; rdnH--; + for ( ; rdnH >= a; rdnH-- ) { + + sprintf( tmp, "%s,%s", tmp, *rdnH ); + + } + + charray_free( a ); + + } + + /* ignore a leading ',' */ + return( strdup( tmp + 1 )); + +} /* get_parentDN */ + + +PUBLIC char *elapsed(firsttime, secondtime) +struct timeval firsttime; +struct timeval secondtime; +{ + long int elapsedmicrosec, elapsedsec; + char elapsed_string[BUFSIZ]; + + elapsedsec = secondtime.tv_sec - firsttime.tv_sec; + elapsedmicrosec = secondtime.tv_usec - firsttime.tv_usec; + if(elapsedmicrosec < 0) { + elapsedmicrosec += 1000000; + elapsedsec -= 1; + } + if(elapsedsec > 1000){ + elapsedsec = 0; + elapsedmicrosec = 0; + } + sprintf(elapsed_string, "%ld.%.6ld", elapsedsec, elapsedmicrosec); + return(strdup(elapsed_string)); +} +/* end of function: elapsed */ + + +/* performance-log on exit */ +PUBLIC int exit_tweb(rc) +int rc; +{ + struct timeval secondtime; + + gettimeofday(&secondtime, NULL); + if(!secondtime.tv_sec || !timestore[0].tv_sec) exit(rc); + + if (dosyslog) + syslog (LOG_INFO, "performance: %s#%s#%s#%s#%s#%s#%d seconds <%08d>", + elapsed(timestore[0], secondtime), elapsed(timestore[0], + timestore[1]), elapsed(timestore[1], timestore[2]), + elapsed(timestore[2], timestore[3]), + elapsed(timestore[3], items_displayed ? timestore[4] : secondtime), + items_displayed ? elapsed(timestore[4], secondtime) : "", + items_displayed, globP->svc_cnt); + exit(rc); +} +/* end of function: exit_tweb */ + diff --git a/contrib/tweb/support.h b/contrib/tweb/support.h new file mode 100644 index 0000000000000000000000000000000000000000..7a68fa168ec91c071994cdb574023c93d295751c --- /dev/null +++ b/contrib/tweb/support.h @@ -0,0 +1,300 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* support.h.. * +* * +* Function:..WorldWideWeb-X.500-Gateway - Support-Functions * +* Based on web500gw.c 1.3 written by Frank Richter, TU Chemmniz * +* which is based on go500gw by Tim Howes, University of * +* Michigan - All rights reserved * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* August 16 1995 Z D D V V * +* Last modification: Z D D V V * +* September 7 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: support.h,v 1.6 1999/09/10 15:01:20 zrnsk01 Exp $ + * + */ + +#ifndef _SUPPORT_ +#define _SUPPORT_ + +#include "support_exp.h" +#include "charray_exp.h" +#include "ch_malloc_exp.h" + + +/* Array for translation */ +/* 0: HEX; 1: uml (not used); 2: flatten */ + +char *encoding_tbl[257][3] = { +/* 0 \0 */ { "%00" , "", NULL }, +/* 1 */ { "%01" , "", NULL }, +/* 2 */ { "%02" , "", NULL }, +/* 3 */ { "%03" , "", NULL }, +/* 4 */ { "%04" , "", NULL }, +/* 5 */ { "%05" , "", NULL }, +/* 6 */ { "%06" , "", NULL }, +/* 7 */ { "%07" , "", NULL }, +/* 8 */ { "%08" , "", NULL }, +/* 9 \t */ { "%09" , " ", NULL }, +/* 10 \n */ { "%0a" , "\n", NULL }, +/* 11 */ { "%0b" , "", NULL }, +/* 12 */ { "%0c" , "", NULL }, +/* 13 */ { "%0d" , " ", NULL }, +/* 14 */ { "%0e" , "", NULL }, +/* 15 */ { "%0f" , "", NULL }, +/* 16 */ { "%10" , "", NULL }, +/* 17 */ { "%11" , "", NULL }, +/* 18 */ { "%12" , "", NULL }, +/* 19 */ { "%13" , "", NULL }, +/* 20 */ { "%14" , "", NULL }, +/* 21 */ { "%15" , "", NULL }, +/* 22 */ { "%16" , "", NULL }, +/* 23 */ { "%17" , "", NULL }, +/* 24 */ { "%18" , "", NULL }, +/* 25 */ { "%19" , "", NULL }, +/* 26 */ { "%1a" , "", NULL }, +/* 27 */ { "%1b" , "", NULL }, +/* 28 */ { "%1c" , "", NULL }, +/* 29 */ { "%1d" , "", NULL }, +/* 30 */ { "%1e" , "", NULL }, +/* 31 */ { "%1f" , "", NULL }, +/* 32 */ { "%20" , " ", NULL }, +/* 33 ! */ { "%21" , "!", NULL }, +/* 34 " */ { "%22" , """, NULL }, +/* 35 # */ { "%23" , "#", NULL }, +/* 36 $ */ { NULL, NULL, NULL }, +/* 37 % */ { "%25" , "%", NULL }, +/* 38 & */ { "%26" , "&", NULL }, +/* 39 ' */ { "%27" , "'", NULL }, +/* 40 ( */ { "%28" , "(", NULL }, +/* 41 ) */ { "%29" , ")", NULL }, +/* 42 * */ { "%2a" , "*", NULL }, +/* 43 + */ { "%2b" , "+", NULL }, +/* 44 , */ { "%2c" , ",", NULL }, +/* 45 - */ { NULL, NULL, NULL }, +/* 46 . */ { NULL, NULL, NULL }, +/* 47 / */ { "%2f" , "/", NULL }, +/* 48 0 */ { NULL, NULL, NULL }, +/* 49 1 */ { NULL, NULL, NULL }, +/* 50 2 */ { NULL, NULL, NULL }, +/* 51 3 */ { NULL, NULL, NULL }, +/* 52 4 */ { NULL, NULL, NULL }, +/* 53 5 */ { NULL, NULL, NULL }, +/* 54 6 */ { NULL, NULL, NULL }, +/* 55 7 */ { NULL, NULL, NULL }, +/* 56 8 */ { NULL, NULL, NULL }, +/* 57 9 */ { NULL, NULL, NULL }, +/* 58 : */ { "%3a" , ":", NULL }, +/* 59 ; */ { "%3b" , ";", NULL }, +/* 60 < */ { "%3c" , "<", NULL }, +/* 61 = */ { "%3d" , "=", NULL }, +/* 62 > */ { "%3e" , ">", NULL }, +/* 63 ? */ { "%3f" , "?", NULL }, +/* 64 @ */ { "%40" , "@", NULL }, +/* 65 A */ { NULL, NULL, NULL }, +/* 66 B */ { NULL, NULL, NULL }, +/* 67 C */ { NULL, NULL, NULL }, +/* 68 D */ { NULL, NULL, NULL }, +/* 69 E */ { NULL, NULL, NULL }, +/* 70 F */ { NULL, NULL, NULL }, +/* 71 G */ { NULL, NULL, NULL }, +/* 72 H */ { NULL, NULL, NULL }, +/* 73 I */ { NULL, NULL, NULL }, +/* 74 J */ { NULL, NULL, NULL }, +/* 75 K */ { NULL, NULL, NULL }, +/* 76 L */ { NULL, NULL, NULL }, +/* 77 M */ { NULL, NULL, NULL }, +/* 78 N */ { NULL, NULL, NULL }, +/* 79 O */ { NULL, NULL, NULL }, +/* 80 P */ { NULL, NULL, NULL }, +/* 81 Q */ { NULL, NULL, NULL }, +/* 82 R */ { NULL, NULL, NULL }, +/* 83 S */ { NULL, NULL, NULL }, +/* 84 T */ { NULL, NULL, NULL }, +/* 85 U */ { NULL, NULL, NULL }, +/* 86 V */ { NULL, NULL, NULL }, +/* 87 W */ { NULL, NULL, NULL }, +/* 88 X */ { NULL, NULL, NULL }, +/* 89 Y */ { NULL, NULL, NULL }, +/* 90 Z */ { NULL, NULL, NULL }, +/* 91 [ */ { "%5b" , "[", NULL }, +/* 92 \ */ { "%5c" , "\\", NULL }, +/* 93 ] */ { "%5d" , "]", NULL }, +/* 94 ^ */ { "%5e" , "^", NULL }, +/* 95 _ */ { NULL, NULL, NULL }, +/* 96 ` */ { "%60" , "`", NULL }, +/* 97 a */ { NULL, NULL, NULL }, +/* 98 b */ { NULL, NULL, NULL }, +/* 99 c */ { NULL, NULL, NULL }, +/* 100 d */ { NULL, NULL, NULL }, +/* 101 e */ { NULL, NULL, NULL }, +/* 102 f */ { NULL, NULL, NULL }, +/* 103 g */ { NULL, NULL, NULL }, +/* 104 h */ { NULL, NULL, NULL }, +/* 105 i */ { NULL, NULL, NULL }, +/* 106 j */ { NULL, NULL, NULL }, +/* 107 k */ { NULL, NULL, NULL }, +/* 108 l */ { NULL, NULL, NULL }, +/* 109 m */ { NULL, NULL, NULL }, +/* 110 n */ { NULL, NULL, NULL }, +/* 111 o */ { NULL, NULL, NULL }, +/* 112 p */ { NULL, NULL, NULL }, +/* 113 q */ { NULL, NULL, NULL }, +/* 114 r */ { NULL, NULL, NULL }, +/* 115 s */ { NULL, NULL, NULL }, +/* 116 t */ { NULL, NULL, NULL }, +/* 117 u */ { NULL, NULL, NULL }, +/* 118 v */ { NULL, NULL, NULL }, +/* 119 w */ { NULL, NULL, NULL }, +/* 120 x */ { NULL, NULL, NULL }, +/* 121 y */ { NULL, NULL, NULL }, +/* 122 z */ { NULL, NULL, NULL }, +/* 123 { */ { "%7b" , "{", NULL }, +/* 124 | */ { "%7c" , "|", NULL }, +/* 125 } */ { "%7d" , "}", NULL }, +/* 126 ~ */ { "%7e" , "~", NULL }, +/* 127 */ { "%7f" , "", NULL }, +/* 128 € */ { "%80" , "€", NULL }, +/* 129 */ { "%81" , "", NULL }, +/* 130 ‚ */ { "%82" , "‚", NULL }, +/* 131 ƒ */ { "%83" , "ƒ", NULL }, +/* 132 „ */ { "%84" , "„", NULL }, +/* 133 … */ { "%85" , "…", NULL }, +/* 134 † */ { "%86" , "†", NULL }, +/* 135 ‡ */ { "%87" , "‡", NULL }, +/* 136 ˆ */ { "%88" , "ˆ", NULL }, +/* 137 ‰ */ { "%89" , "‰", NULL }, +/* 138 Š */ { "%8a" , "Š", NULL }, +/* 139 ‹ */ { "%8b" , "‹", NULL }, +/* 140 Œ */ { "%8c" , "Œ", NULL }, +/* 141 */ { "%8d" , "", NULL }, +/* 142 Ž */ { "%8e" , "Ž", NULL }, +/* 143 */ { "%8f" , "", NULL }, +/* 144 */ { "%90" , "", NULL }, +/* 145 ‘ */ { "%91" , "‘", NULL }, +/* 146 ’ */ { "%92" , "’", NULL }, +/* 147 “ */ { "%93" , "“", NULL }, +/* 148 ” */ { "%94" , "”", NULL }, +/* 149 • */ { "%95" , "•", NULL }, +/* 150 – */ { "%96" , "–", NULL }, +/* 151 — */ { "%97" , "—", NULL }, +/* 152 ˜ */ { "%98" , "˜", NULL }, +/* 153 ™ */ { "%99" , "™", NULL }, +/* 154 š */ { "%9a" , "š", NULL }, +/* 155 › */ { "%9b" , "›", NULL }, +/* 156 œ */ { "%9c" , "œ", NULL }, +/* 157 */ { "%9d" , "", NULL }, +/* 158 ž */ { "%9e" , "ž", NULL }, +/* 159 Ÿ */ { "%9f" , "Ÿ", NULL }, +/* 160 */ { "%a0" , "", NULL }, +/* 161 */ { "%a1" , "", NULL }, +/* 162 */ { "%a2" , "", NULL }, +/* 163 */ { "%a3" , "", NULL }, +/* 164 */ { "%a4" , "", NULL }, +/* 165 */ { "%a5" , "", NULL }, +/* 166 */ { "%a6" , "", NULL }, +/* 167 */ { "%a7" , "", NULL }, +/* 168 */ { "%a8" , "", NULL }, +/* 169 */ { "%a9" , "", NULL }, +/* 170 */ { "%aa" , "", NULL }, +/* 171 */ { "%ab" , "", NULL }, +/* 172 */ { "%ac" , "", NULL }, +/* 173 */ { "%ad" , "", NULL }, +/* 174 */ { "%ae" , "", NULL }, +/* 175 */ { "%af" , "", NULL }, +/* 176 */ { "%b0" , "", NULL }, +/* 177 */ { "%b1" , "", NULL }, +/* 178 */ { "%b2" , "", NULL }, +/* 179 */ { "%b3" , "", NULL }, +/* 180 */ { "%b4" , "", NULL }, +/* 181 */ { "%b5" , "", NULL }, +/* 182 */ { "%b6" , "", NULL }, +/* 183 */ { "%b7" , "", NULL }, +/* 184 */ { "%b8" , "", NULL }, +/* 185 */ { "%b9" , "", NULL }, +/* 186 */ { "%ba" , "", NULL }, +/* 187 */ { "%bb" , "", NULL }, +/* 188 */ { "%bc" , "", NULL }, +/* 189 */ { "%bd" , "", NULL }, +/* 190 */ { "%be" , "", NULL }, +/* 191 */ { "%bf" , "", NULL }, +/* 192 */ { "%c0" , "À", "A" }, +/* 193 */ { "%c1" , "Á", "A" }, +/* 194 */ { "%c2" , "Â", "A" }, +/* 195 */ { "%c3" , "Ã", "A" }, +/* 196 */ { "%c4" , "Ä", "Ae" }, +/* 197 */ { "%c5" , "Å", "A" }, +/* 198 */ { "%c6" , "Æ", "AE" }, +/* 199 */ { "%c7" , "Ç", "C" }, +/* 200 */ { "%c8" , "È", "E" }, +/* 201 */ { "%c9" , "É", "E" }, +/* 202 */ { "%ca" , "Ê", "E" }, +/* 203 */ { "%cb" , "Ë", "E" }, +/* 204 */ { "%cc" , "Ì", "I" }, +/* 205 */ { "%cd" , "Í", "I" }, +/* 206 */ { "%ce" , "Î", "I" }, +/* 207 */ { "%cf" , "Ï", "I" }, +/* 208 */ { "%d0" , "Ð", "Eth" }, +/* 209 */ { "%d1" , "Ñ", "N" }, +/* 210 */ { "%d2" , "Ò", "O" }, +/* 211 */ { "%d3" , "Ó", "O" }, +/* 212 */ { "%d4" , "Ô", "O" }, +/* 213 */ { "%d5" , "Õ", "O" }, +/* 214 */ { "%d6" , "Ö", "Oe" }, +/* 215 */ { "%d7" , "x", "x" }, +/* 216 */ { "%d8" , "Ø", "O" }, +/* 217 */ { "%d9" , "Ù", "U" }, +/* 218 */ { "%da" , "Ú", "U" }, +/* 219 */ { "%db" , "Û", "U" }, +/* 220 */ { "%dc" , "Ü", "Ue" }, +/* 221 */ { "%dd" , "Ý", "Y" }, +/* 222 */ { "%de" , "Þ", NULL }, +/* 223 */ { "%df" , "ß", "ss" }, +/* 224 */ { "%e0" , "à", "a" }, +/* 225 */ { "%e1" , "á", "a" }, +/* 226 */ { "%e2" , "â", "a" }, +/* 227 */ { "%e3" , "ã", "a" }, +/* 228 */ { "%e4" , "ä", "ae" }, +/* 229 */ { "%e5" , "å", "a" }, +/* 230 */ { "%e6" , "æ", "ae" }, +/* 231 */ { "%e7" , "ç", "c" }, +/* 232 */ { "%e8" , "è", "e" }, +/* 233 */ { "%e9" , "é", "e" }, +/* 234 */ { "%ea" , "ê", "e" }, +/* 235 */ { "%eb" , "ë", "e" }, +/* 236 */ { "%ec" , "ì", "i" }, +/* 237 */ { "%ed" , "í", "i" }, +/* 238 */ { "%ee" , "î", "i" }, +/* 239 */ { "%ef" , "ï", "i" }, +/* 240 */ { "%f0" , "ð", "eth" }, +/* 241 */ { "%f1" , "ñ", "n" }, +/* 242 */ { "%f2" , "ò", "o" }, +/* 243 */ { "%f3" , "ó", "o" }, +/* 244 */ { "%f4" , "ô", "o" }, +/* 245 */ { "%f5" , "õ", "o" }, +/* 246 */ { "%f6" , "ö", "oe" }, +/* 247 */ { "%f7" , "/", "/" }, +/* 248 */ { "%f8" , "ø", "o" }, +/* 249 */ { "%f9" , "ù", "u" }, +/* 250 */ { "%fa" , "ú", "u" }, +/* 251 */ { "%fb" , "û", "u" }, +/* 252 */ { "%fc" , "ü", "ue" }, +/* 253 */ { "%fd" , "ý", "y" }, +/* 254 */ { "%fe" , "þ", NULL }, +/* 255 */ { "%ff" , "ÿ", "y" }, +/* 256 EOF*/ { NULL, NULL, NULL }, +}; + +#endif /* _SUPPORT_ */ + + diff --git a/contrib/tweb/support_exp.h b/contrib/tweb/support_exp.h new file mode 100644 index 0000000000000000000000000000000000000000..9df9795f7a0e1c54b438b48c4d24c381d6c9730d --- /dev/null +++ b/contrib/tweb/support_exp.h @@ -0,0 +1,68 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* support_exp.h * +* * +* Function:..WorldWideWeb-X.500-Gateway - Supporting Routines * +* Based on web500gw.c 1.3 written by Frank Richter, TU Chemmniz * +* which is based on go500gw by Tim Howes, University of * +* Michigan - All rights reserved * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* December 2 1995 Z D D V V * +* Last modification: Z D D V V * +* September 7 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: support_exp.h,v 1.6 1999/09/10 15:01:20 zrnsk01 Exp $ + * + */ + +#ifndef _SUPPORT_EXP_H_ +#define _SUPPORT_EXP_H_ + +PUBLIC char * hex_decode (); +PUBLIC char * hex_qdecode (); +PUBLIC char * form_encode (); + +PUBLIC char * format_date (); +PUBLIC char * friendly_dn (); +PUBLIC char * format_time (); +PUBLIC char * strQuoteChr(); +PUBLIC int strlstcmp (/* char *s1, char *s2, char sep */); +PUBLIC void re_fail (); +PUBLIC char *dnrcut(/*rdn, target, basecount*/); +PUBLIC void disp_file (/* GLOB_STRUCT glob, char *filename, FILE *fp */); + +PUBLIC char *elapsed(); + +PUBLIC char *hex_html_encode(); + +#define hex_encode(x) hex_html_encode((x), 0) +#define char2html(x) hex_html_encode((x), 1) +#define flatten_chars(x) hex_html_encode((x), 2) + +PUBLIC char * get_parentDN(); +PUBLIC char **dn2charray(); +PUBLIC char * strrQuoteChr(); +PUBLIC int exit_tweb(); + + +/* dn_cmp and return codes */ +PUBLIC int dn_cmp( /* dn1, dn2 */ ); +PUBLIC int dn_cmp_parts( /* dn1, dn2, &matched */ ); +#define DN_EQUAL 0 /* dns are exactly equal */ +#define DN_LESS -1 /* dn1 is part of dn2 */ +#define DN_GREATER 1 /* dn2 is part of dn1 */ +#define DN_UNMATCHED -2 /* dns differ, matched is the same */ + /* (matched as seen from c down) */ + + +#endif + diff --git a/contrib/tweb/tgeneral.h b/contrib/tweb/tgeneral.h new file mode 100644 index 0000000000000000000000000000000000000000..4eb0adcbf890d41a3abd29df572c01d596337681 --- /dev/null +++ b/contrib/tweb/tgeneral.h @@ -0,0 +1,246 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* tgeneral.h. * +* * +* Function:..General-Headerfile for TWEB * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* August 16 1995 Z D D V V * +* Last modification: Z D D V V * +* May 14 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: tgeneral.h,v 1.6 1999/09/10 15:01:20 zrnsk01 Exp $ + * + */ + + +#ifndef _TGENERAL_ +#define _TGENERAL_ + +#define PUBLIC +#define PRIVATE static + +/* For changes see file CHANGES */ +#ifdef __hpux +#define _INCLUDE_POSIX_SOURCE +#define _INCLUDE_XOPEN_SOURCE +#define _INCLUDE_HPUX_SOURCE +#define TIOCNOTTY _IO('t', 113) +#define getdtablesize() _NFILE +#endif + +#if defined( __linux__ ) && !defined( _BSD_SOURCE ) +#define _BSD_SOURCE +#define _SVID_SOURCE +#define _GNU_SOURCE +#define _POSIX_SOURCE +#endif + +#include <string.h> +#include <strings.h> +#include <sys/time.h> +#include <time.h> +#include "lber.h" +#include "ldap.h" +#include <stdio.h> +#include <ctype.h> +#include <sys/types.h> +#include <sys/param.h> +#include <sys/stat.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <netdb.h> +#include <syslog.h> +#include <sys/wait.h> +#include <signal.h> +#include <errno.h> +#include <stdlib.h> +#include <unistd.h> + +extern int errno; + + +#include "strng_exp.h" + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif +#define OK 1 +#define NOTOK 0 +#define DONE -1 +#define _TIMEOUT_LEN 31 +#define _LOG_TIME "%a, %d.%m.%y, %H:%M:%S" + +#include "init_exp.h" +extern GLOB_STRUCT *globP; + +/* + *************************************************************************** + * If you are not a University of Tuebingen site, + * you probably want to tailor the following: + *************************************************************************** + */ + +/* Special code for DFN-Project AMBIX-D */ +#ifdef AMBIXGW + +# define SELBST_CN glob->selbsteintrag[0] +# define SELBST_CN_NAME glob->selbsteintrag[1] +# define SELBST_STUDIE_ATTR glob->selbsteintrag[2] +# define SELBST_INSERT_MODE glob->selbsteintrag[3] +# define SELBST_INSERT_WHO glob->selbsteintrag[4] +# define SELBST_INSERT_NO glob->selbsteintrag[5] +# define SELBST_INSERT_WORK glob->selbsteintrag[6] +# define SELBST_INSERT_ALL glob->selbsteintrag[7] +# define SELBST_INSERT_STUD glob->selbsteintrag[8] + +# define MAXDN_LEN 2048 + +extern void self_insert(); + +#endif + + + +/* Flags for print_attr */ +#define DEFAULT 0 +#define MULTILINE 1 +#define HREF 2 +#define FINGER 3 +#define DATE 4 +#define URL 5 +#define MAILTO 6 +#define MOVETO 7 +#define BMP 8 +#define JPEG 9 +#define JPEG2GIF 10 +#define BOOLEAN 11 +#define URI 12 +#define PGPKEY 13 +#define INDEXURL 14 +#define DYNAMICDN 15 +#define REFERRAL 20 +#define PRE 21 +#define HEADER 22 + +#ifdef TUE_TEL +#define PHONREFSHORT 16 +#define PHONREFLONG 17 +#define TFUNCPERS 18 +#define FAXTABLE 19 +#endif + + +/* Patch for hpux from ksp: */ +#ifdef __hpux +# define rewind(a) fflush(a) +#endif + +#define G3TOXBM "cat" +#define JPEGTOGIF "/soft/bin/djpeg -gif" + +/* + ************************************************************************* + * The rest of this stuff probably does not need to be changed + ************************************************************************* + */ + +#define TIMEOUT 240 +#define WEB500PORT 8889 + +#ifndef FD_SET +#define NFDBITS 32 +#define FD_SETSIZE 32 +#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) +#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) +#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) +#define FD_ZERO(p) bzero((char *)(p), sizeof(*(p))) +#endif + +#define from_hex(c) ((c>='0')&&(c<='9') ? c-'0' : (c>='A')&&(c<='F') ?\ + c-'A'+10 : (c>='a')&&(c<='f') ? c-'a'+10 : 0) + +/* + * HTTP request we are implementing + */ + +#define UNKNOWN 0 +#define GET 1 +#define HEAD 2 + +/* + * HTTP response status + */ +#define DOCUMENT_FOLLOWS 200 +#define REDIRECT 302 +#define BAD_REQUEST 400 +#define AUTH_REQUIRED 401 +#define FORBIDDEN 403 +#define NOT_FOUND 404 +#define SERVER_ERROR 500 +#define NOT_IMPLEMENTED 501 + +#define PRINT_HTML_HEADER (fprintf(fp, \ +"HTTP/1.0 %d Document follows\n\ +MIME-Version: 1.0\n\ +Server: %s\n\ +Date: %s\n\ +Content-Type: text/html\n\ +Last-Modified: %s\n\ +%s\n",\ +DOCUMENT_FOLLOWS, version, glob->nowtimestr, glob->nowtimestr,\ + glob->caching ? glob->expiretimestr : "Pragma: no-cache\n" )) + +#define PRINT_PLAIN_HEADER (fprintf(fp, \ +"HTTP/1.0 %d Document follows\n\ +MIME-Version: 1.0\n\ +Server: %s\n\ +Date: %s\n\ +Content-Type: text/plain\n\ +Last-Modified: %s\n\ +%s\n",\ +DOCUMENT_FOLLOWS, version, glob->nowtimestr, glob->nowtimestr,\ + glob->caching ? glob->expiretimestr : "Pragma: no-cache\n" )) + +#define PRINT_REDIRECT_HEADER (fprintf(fp, \ +"HTTP/1.0 302 Found\n\ +MIME-Version: 1.0\n\ +Server: %s\n\ +Date: %s\n\ +Location: %s\n\ +Content-Type: text/html\n\ +Last-Modified: %s\n\ +%s\n",\ +version, glob->nowtimestr, query, glob->nowtimestr,\ + glob->caching ? glob->expiretimestr : "Pragma: no-cache\n" )) + +#define HTML_HEAD_TITLE "<HTML><HEAD><TITLE>%s</TITLE></HEAD><%s>" + +#define PRINT_HTML_FOOTER (fprintf(fp, "</BODY></HTML>")) + +/* Meta-Syntax of Gateway-Switching feature */ +#define GWS "(gw)" +#define GWS_FORMAT "(gw-%s)" + + +#define OUT_TIME 900 + +/* Separator in UFNs */ +#define UFNSEP "," + +#endif /* _TGENERAL_ */ + diff --git a/contrib/tweb/tglobal.h b/contrib/tweb/tglobal.h new file mode 100644 index 0000000000000000000000000000000000000000..f115592ad58ddcf75f3af948fce17107320908c2 --- /dev/null +++ b/contrib/tweb/tglobal.h @@ -0,0 +1,68 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* tglobal.h.. * +* * +* Function:..Global variables for TWEB * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* August 16 1996 Z D D V V * +* Last modification: Z D D V V * +* December 29 1998 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: tglobal.h,v 1.6 1999/09/10 15:01:20 zrnsk01 Exp $ + * + */ + + +#ifndef _TGLOBAL_ +#define _TGLOBAL_ + +#include "lber.h" +#include "ldap.h" + + +extern int debug; +extern int dosyslog; +extern struct timeval timestore[]; +extern int items_displayed; + +extern int searchaliases; + +#if defined LDAP_VENDOR_NAME && defined LDAP_API_VERSION +# if LDAP_API_VERSION > 2001 && LDAP_API_VERSION < 2010 + +extern LDAPFriendlyMap *fm; + +# else + +extern LDAPFriendlyMap *fm; + +# endif +#else + +extern FriendlyMap *fm; + +#endif + +extern LDAPFiltDesc *filtd; + +extern char version[]; +extern char copyright[]; + +extern int http; /* HTTP-header in request -> also in reply */ + +extern int request; + + +#endif /* _TGLOBAL */ + + diff --git a/contrib/tweb/tweb.c b/contrib/tweb/tweb.c new file mode 100644 index 0000000000000000000000000000000000000000..fcf454ce41fdc196bc0ff461759b920381269b59 --- /dev/null +++ b/contrib/tweb/tweb.c @@ -0,0 +1,179 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* tweb.c..... * +* * +* Function:..WorldWideWeb-X.500-Gateway MAIN-Routine * +* Based on web500gw.c 1.3 written by Frank Richter, TU Chemmniz * +* which is based on go500gw by Tim Howes, University of * +* Michigan - All rights reserved * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* August 16 1995 Z D D V V * +* Last modification: Z D D V V * +* December 31 1996 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: tweb.c,v 1.6 1999/09/10 15:01:20 zrnsk01 Exp $ + * + */ + + +/* + * redesign BW 94/08/16 + * patched for HPUX 9.x by /KSp, 94/04/28 + * patched for AMBIX-D and use at University of Tuebingen by /KSp, + * patched for always-assume-nonleaf-behaviour-and-reread-on-demand; /KSp + * patched for restricted listing of Tuebinger students; /KSp + * patched for mailto HREF in mail attribute; /KSp + * patched for automatic referral to Chemnitz in case of ROOT access + * (AMBIX version only); /KSp + * patched for correct response in case of not found error; /MCl + * neg patched: subtree search below locality removed; /KSp + * patched for automatic referral to AMBIX in case of l=DFN access + * (non-AMBIX version only); /KSp + * patched for lower case compare during access control; /KSp + * patched for menu-'seeAlso' in AMBIXGW; /KSp + * patched for pgpPubKey formatting as MULTILINE; /KSP + * correction of MULTILINE handling; /KSp + * objectClass deleted from menu list entry in html-code; /KSp + * patched for "Selbsteintrag" needed by AMBIX-Project /mc + * last update: 95/07/07 + * + * 95/07/17 changed to ANSI-C, deleted lots of compiletime-options. /mc + * + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of Tuebingen. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. This software + * is provided ``as is'' without express or implied warranty. + * + * ---------------------------------------------------------------------- + */ + +#include "tweb.h" + +PUBLIC int main (argc, argv) +int argc; +char **argv; + +{ + /* The Glob-structure is NOT a global variable, but is stored here for + all other functions !!! */ + GLOB_STRUCT glob; + char lang[BUFSIZ]; + int pid, i; + + /* make glob global available */ + globP = &glob; + + /* first of all the language-parameter is scanned from the command-line + and is written as first value to the Glob-structure */ + get_lang(argc, argv, lang); + bzero((char *) &glob, sizeof(GLOB_STRUCT)); + glob.olang = strdup(lang); + + /* Now start a process for each language and terminate the super-process */ + for(i=0; i<strlen(lang); i++){ + + /* memorize the sub-process-language */ + *glob.lang = lang[i]; + + switch( pid = fork() ) { + + /* the Sub-Process */ + case 0: + do_child(argc, argv,lang, &glob); + break; + + /* A Sub-Process could not be created !!! */ + case -1: + perror( "fork" ); + break; + + /* the Parent-Process */ + default: + if ( debug ) + fprintf( stderr, "forked child %d\n", pid ); + break; + } + } + + return( 0 ); +} +/* end of function: main */ + + +/** + ** do_child() + ** + ** Main-Function for the working-processes; until now only the + ** language is initialized. The rest of the configuration + ** must be scanned now. + **/ + +PRIVATE void do_child(argc, argv,lang, glob) +int argc; +char **argv; +char *lang; +GLOB_STRUCT *glob; + +{ + FILE *fp = NULL; + char filename[BUFSIZ]; + + /* read language-independent (.rc) and -dependent (.conf) configuration */ + init(argv, lang, glob); + + /* read commandline-parameter (they overwrite conf) */ + getopts (argc, argv, glob); + + /* If debug-Mode: Configuration Output */ + if (debug) { + + sprintf(filename, "%s.debug", glob->myname); + fp =fopen(filename, "a"); + fprintf(fp, "\n\n\n#####%s.%s-log Date: %s\n\n", + glob->myname, glob->lang, format_time(NULL)); + output(fp, glob, FALSE); + + } + + /* read language-strings (from .lang) and write out if desired */ + langinit(glob); + + if (debug) { + + langoutput(fp, glob, FALSE); + fclose(fp); + + } + + /* Final Configuration-Test */ + check(glob); + + /* If dynamic Gateway-Switching is enabled the language-dependent + recognition-string for the meta-Syntax must be fixed + (language-independent recognition-string is given in Macro GWS ) */ + if(glob->gw_switch->dynamic) { + char strbuf[BUFSIZ]; + + sprintf(strbuf, GWS_FORMAT, glob->la[0]); + glob->gw_switch->lagws = strdup(strbuf); + } + + /* and now start the Gateway ... */ + start_server(glob); + +} +/* end of function: do_child */ + + diff --git a/contrib/tweb/tweb.h b/contrib/tweb/tweb.h new file mode 100644 index 0000000000000000000000000000000000000000..fe1d49ec61b4ec8dc05f6fb21dbbf65f8ff36c52 --- /dev/null +++ b/contrib/tweb/tweb.h @@ -0,0 +1,72 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* tweb.h..... * +* * +* Function:..Header-File for TWEB-SOFTWARE * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* August 16 1995 Z D D V V * +* Last modification: Z D D V V * +* December 31 1998 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: tweb.h,v 1.6 1999/09/10 15:01:20 zrnsk01 Exp $ + * + */ + + +#ifndef _TWEB_ +#define _TWEB_ + + +#include "tgeneral.h" +#include "init_exp.h" +#include "server_exp.h" +#include "support_exp.h" + +PRIVATE void do_child(); +int debug; +int dosyslog = 0; + +GLOB_STRUCT *globP; + +int searchaliases = 1; + +#if defined LDAP_VENDOR_NAME && defined LDAP_API_VERSION +# if LDAP_API_VERSION > 2001 && LDAP_API_VERSION < 2010 + +LDAPFriendlyMap *fm = NULL; + +# else + +LDAPFriendlyMap *fm = NULL; + +# endif +#else + +FriendlyMap *fm = NULL; + +#endif + +LDAPFiltDesc *filtd; + +extern char version[]; + +int http = 1; /* HTTP Version ??? */ + +int request = UNKNOWN; + + + +#endif /* _TWEB_ */ + + diff --git a/contrib/tweb/x500.c b/contrib/tweb/x500.c new file mode 100644 index 0000000000000000000000000000000000000000..a8a02f70a2155e5c85b1f6179cdfd5cc30b70daf --- /dev/null +++ b/contrib/tweb/x500.c @@ -0,0 +1,2164 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* x500.c..... * +* * +* Function:..WorldWideWeb-X.500-Gateway - X.500-Access-Routines * +* Based on web500gw.c 1.3 written by Frank Richter, TU Chemmniz * +* which is based on go500gw by Tim Howes, University of * +* Michigan - All rights reserved * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* August 16 1995 Z D D V V * +* Last modification: Z D D V V * +* September 10 1999 ZZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: x500.c,v 1.8 1999/09/10 15:01:20 zrnsk01 Exp $ + * + */ + +#include "tgeneral.h" +#include "tglobal.h" +#include "x500.h" +#include "init_exp.h" +#include "support_exp.h" +#include "html_exp.h" + +#ifdef TUE_TEL +#include "tueTel_exp.h" +#endif + +#if defined( TUE_TEL ) || defined( AMBIXGW ) +#include "resort_exp.h" +#endif + + +PRIVATE int compare(a,b) +DNLIST **a, **b; +{ + return strcmp((*a)->string,(*b)->string); +} +/* end of function: compare */ + + +PRIVATE char * pick_oc(oclist) +char **oclist; +{ + int i; + + if ( oclist == NULL ) + return( "unknown" ); + + for ( i = 0; oclist[i] != NULL; i++ ) { + if ( strcasecmp( oclist[i], "top" ) != 0 && + strcasecmp( oclist[i], "quipuObject" ) != 0 && + strcasecmp( oclist[i], "quipuNonLeafObject" ) != 0 ) + return( str_tolower (oclist[i]) ); + } + + return( "unknown" ); +} +/* end of function: pick_oc */ + + +PUBLIC char * make_oc_to_string(oc) +char **oc; +{ + static char oc_res[BUFSIZ]; + int i; + + if(!oc) return(NULL); + + *oc_res = '|'; + *(oc_res+1) = '\0'; + for(i = 0; oc[i] && *oc[i]; i++) { + sprintf(oc_res, "%s%s|", oc_res, oc[i]); + } + return(str_tolower (oc_res)); +} +/* end of function: make_oc_to_string */ + + +PUBLIC void do_xtend(ld, fp, query, filter, glob) +LDAP *ld; +FILE *fp; +char *query; +char *filter; +GLOB_STRUCT *glob; +{ + char *strptr, dn[BUFSIZ], command[BUFSIZ], extension[BUFSIZ]; + + strptr = strchr(query, '?'); + *strptr++ = '\0'; + strcpy(dn, query); + strcpy(command, strptr); + if( ( strptr = strchr(command, '#')) ) { + *strptr++ = '\0'; + strcpy(extension, strptr); + } + + if(!strcasecmp(command, "MENU")){ + glob->tables_marker = strdup(extension); + do_menu(ld, fp, dn, "", glob); + } + +#ifdef TUE_TEL + if(!strcasecmp(command, "PHONEBOOK")){ + do_phonebook(ld, fp, strstr(dn, "ou=TELEFONBUCH") ? dn + : NULL, extension, glob, 1); + } +#endif + +} +/* end of function: do_xtend */ + +PUBLIC void do_menu(ld, fp, dn, filter, glob) +LDAP *ld; +FILE *fp; +char *dn; +char *filter; +GLOB_STRUCT *glob; +{ + int rc; + LDAPMessage *pres; + struct timeval timeout; + static char *sattrs[] = { "objectClass", "labeledURI", + "aliasedObjectName", "mail", + "cn", "telephonenumber", +#ifdef TUE_TEL + "tat_ton", "tat_refphone", +#endif + 0 }; + static char **attrs = NULL; + int counter = 0; + pSEARCH_ONLY_LINE so_ptr; + char la_url[BUFSIZ]; + int count; + char *ufn; + + if(!attrs) + attrs = (char**) charray_dup(sattrs); + + charray_merge(&attrs, glob->sort_attribs); + + if(glob->raw_data) + charray_merge(&attrs, glob->raw_attrs); + + for(so_ptr = glob->search_only; so_ptr; so_ptr = so_ptr->next) { + if (dn_cmp(dn, so_ptr->dn) == 0) { + break; + } + } + + if(!so_ptr) { + + timeout.tv_sec = glob->timeout; + timeout.tv_usec = 0; + +#if defined LDAP_VENDOR_NAME && defined LDAP_API_VERSION +# if LDAP_API_VERSION > 2001 && LDAP_API_VERSION < 2010 + + ldap_set_option( ld, LDAP_OPT_DEREF, LDAP_DEREF_ALWAYS ); + +# endif +#else + ld->ld_deref = LDAP_DEREF_FINDING; +#endif + + if ( (rc = ldap_search_st( ld, dn, LDAP_SCOPE_ONELEVEL, + glob->menu_filter, attrs, 0, &timeout, &pres )) != LDAP_SUCCESS + && rc != LDAP_SIZELIMIT_EXCEEDED + && rc != LDAP_INSUFFICIENT_ACCESS ) { + do_error(fp, rc, NOT_FOUND, glob); + return; + } + + if (rc == LDAP_SIZELIMIT_EXCEEDED) glob->persRestricted = TRUE; + +#if defined LDAP_VENDOR_NAME && defined LDAP_API_VERSION +# if LDAP_API_VERSION > 2001 && LDAP_API_VERSION < 2010 + + ldap_set_option( ld, LDAP_OPT_DEREF, LDAP_DEREF_ALWAYS ); + +# endif +#else + ld->ld_deref = LDAP_DEREF_ALWAYS; +#endif + + if ((count = (ldap_count_entries(ld, pres) )) < 1) { + ldap_msgfree (pres); + do_read (ld, fp, dn, 0, glob); + return; + } + items_displayed = count; + } + + if (http == 1) { + PRINT_HTML_HEADER; + } + if (request == HEAD) { + fflush(fp); + exit_tweb (1); + } + fprintf( fp, HTML_HEAD_TITLE, ufn = friendly_dn(dn, glob), glob->la[100]); + if ( ufn ) free( ufn ); + + if (dn_cmp(dn, glob->basedn->dn) == 0) + disp_file(glob, glob->basedn->head, fp); + else if(so_ptr && so_ptr->head) + disp_file(glob, so_ptr->head, fp); + else + disp_file(glob, glob->header, fp); + +#ifdef TUE_TEL + fprintf (fp, "\n<A NAME=\"phonebook=Telefonbuch\"></A>\n"); + fprintf (fp, "\n<A NAME=\"phonebook\"></A>\n"); +#endif + + make_la_buttons("M", fp, ld, dn, la_url, glob ); + + make_header( fp, dn, 0, glob); + + print_rdn(fp, dn, glob); + + make_search_box(fp, ld, dn, glob); + +#ifdef AMBIXGW + /* Button leading to cgi-script */ + if( glob->form_button && !glob->selbsteintrag[0]){ + char **oc; + LDAPMessage *res; + struct timeval timeout; + static char *attrs[] = { "objectClass", 0 }; + + timeout.tv_sec = glob->timeout; + timeout.tv_usec = 0; + if ( ldap_search_st( ld, dn, LDAP_SCOPE_BASE, "objectClass=*", + attrs, 0, &timeout, &res ) != LDAP_SUCCESS ) { + exit_tweb( 1 ); + } + oc = ldap_get_values( ld, ldap_first_entry( ld, res ), "objectClass" ); + + disp_form_button(0, oc, dn, ld, fp, glob); + } + + /* check to see if selfinsert-buttons are appropriate here */ + if(glob->selbsteintrag[0]) + self_insert(ld,fp,dn,glob); +#endif + +#ifdef TUE_TEL + /* Named link to skip header */ + fprintf (fp, "\n<A NAME=\"pure-data\"></A>\n"); +#endif + + fprintf(fp, glob->la[101]); + + + if(!so_ptr) { + + /* DO_MENU */ + counter = sort_result( ld, pres, dn, glob); + + /* get time for performance log */ + gettimeofday(×tore[4], NULL); + + list_output(fp, glob); + + if ( ldap_result2error( ld, pres, 1 ) == LDAP_SIZELIMIT_EXCEEDED + || glob->restricted ) + do_sizelimit(fp, 1, glob); + + if(glob->legal && !glob->legal_top) + fprintf (fp, "%s\n%s\n", glob->la[101], + glob->is_proxy ? glob->la[104] : glob->la[65]); + } + + if (dn_cmp(dn,glob->basedn->dn) == 0) + disp_file(glob, glob->basedn->foot, fp); + else if(so_ptr && so_ptr->foot) + disp_file(glob, so_ptr->foot, fp); + else + disp_file(glob, glob->footer, fp); + + PRINT_HTML_FOOTER; +} +/* end of function: do_menu */ + + +PRIVATE int make_scope(ld, dn, glob) +LDAP *ld; +char *dn; +GLOB_STRUCT *glob; +{ + int scope, idx; + char **oc; + LDAPMessage *res; + struct timeval timeout; + static char *attrs[] = { "objectClass", 0 }; + + if ( strcmp( dn, "" ) == 0 ) + return( LDAP_SCOPE_ONELEVEL ); + + timeout.tv_sec = glob->timeout; + timeout.tv_usec = 0; + if ( ldap_search_st( ld, dn, LDAP_SCOPE_BASE, "objectClass=*", + attrs, 0, &timeout, &res ) != LDAP_SUCCESS ) { + return( -1 ); + } + + oc = ldap_get_values( ld, ldap_first_entry( ld, res ), "objectClass" ); + + /* set scope according to configured object-classes */ + scope = LDAP_SCOPE_ONELEVEL; + for(idx = 0; glob->subtree_search && glob->subtree_search[idx]; idx++) + if( charray_inlist( oc, glob->subtree_search[idx])) + scope = LDAP_SCOPE_SUBTREE; + + ldap_value_free( oc ); + ldap_msgfree( res ); + + return( scope ); +} +/* end of function: make_scope */ + +PUBLIC int do_search(ld, fp, query, glob) +LDAP *ld; +FILE *fp; +char *query; +GLOB_STRUCT *glob; +{ + int scope; + char *base, *filter, *strptr; + char *filtertype; + int count = 0, rc; + struct timeval timeout; + LDAPFiltInfo *fi; + LDAPMessage *e, *res = NULL; + static char *attrs[] = { "objectClass", "cn", "sn", "labeledURI", + "aliasedObjectName", 0 }; + int counter = 0; + char *ufn; + char title[BUFSIZ], title2[BUFSIZ]; + + glob->no_browse = FALSE; + +/* query string: base-DN?[OS]=filter + * search onelevel <--||--> search subtree + */ + if ( (filter = strchr( query, '?' )) == NULL ) { + explain_error( fp, glob->la[89], BAD_REQUEST, glob ); + exit_tweb( 1 ); + } + *filter++ = '\0'; + if (*filter == '\0' || *(filter+1) != '=') { + explain_error( fp, glob->la[90], BAD_REQUEST, glob); + exit_tweb( 1 ); + } + if( ( strptr = strchr(filter, '&')) ) + *strptr = '\0'; + if( ( strptr = strchr(filter, '*')) ) + *strptr = '\0'; + if (*filter == 'S') { + scope = LDAP_SCOPE_SUBTREE; + } else { + scope = LDAP_SCOPE_ONELEVEL; + } + filter += 2; + if (*filter == '\0') { + explain_error( fp, glob->la[92], BAD_REQUEST, glob); + exit_tweb( 1 ); + } + /* deutsche Umlaute plaetten */ + filter = flatten_chars(filter); + + base = query; + + filtertype = (scope == LDAP_SCOPE_ONELEVEL ? "web500gw onelevel" : + "web500gw subtree"); + +#if defined LDAP_VENDOR_NAME && defined LDAP_API_VERSION +# if LDAP_API_VERSION > 2001 && LDAP_API_VERSION < 2010 + + ldap_set_option( ld, LDAP_OPT_DEREF, + scope == LDAP_SCOPE_ONELEVEL ? LDAP_DEREF_FINDING : + LDAP_DEREF_ALWAYS ); + +# endif +#else + ld->ld_deref = (scope == LDAP_SCOPE_ONELEVEL ? LDAP_DEREF_FINDING : + LDAP_DEREF_ALWAYS); +#endif + + timeout.tv_sec = glob->timeout; + timeout.tv_usec = 0; + + for (fi=ldap_getfirstfilter( filtd, filtertype, filter ); fi != NULL; + fi = ldap_getnextfilter( filtd ) ) { + if ( (rc = ldap_search_st( ld, base, scope, fi->lfi_filter, + attrs, 0, &timeout, &res )) != LDAP_SUCCESS + && rc != LDAP_SIZELIMIT_EXCEEDED ) { + + if (dosyslog) { + +#if defined LDAP_VENDOR_NAME && defined LDAP_API_VERSION +# if LDAP_API_VERSION > 2001 && LDAP_API_VERSION < 2010 + + int ld_errno; + + ldap_get_option(ld, LDAP_OPT_ERROR_NUMBER, &ld_errno); + syslog (LOG_INFO, "ldap_search_st(): %s", + ldap_err2string ( ld_errno )); + +# endif +#else + syslog (LOG_INFO, "ldap_search_st(): %s", + ldap_err2string (ld->ld_errno)); +#endif + + } + + do_error(fp, rc, NOT_FOUND, glob); + return( 1 ); + } + + if ( res && (count = ldap_count_entries( ld, res )) != 0 ) { + + break; + } + + } + items_displayed = count; + +#if defined LDAP_VENDOR_NAME && defined LDAP_API_VERSION +# if LDAP_API_VERSION > 2001 && LDAP_API_VERSION < 2010 + + ldap_set_option( ld, LDAP_OPT_DEREF, LDAP_DEREF_ALWAYS ); + +# endif +#else + ld->ld_deref = LDAP_DEREF_ALWAYS; +#endif + + if ( count == 0 ) { + + if (http == 1) { + fprintf(fp, "HTTP/1.0 404 %s \n", glob->la[6]); + fprintf(fp, "MIME-Version: 1.0\n"); + fprintf(fp, "Content-Type: text/html\n\n"); + } + + if (request == HEAD) { + fflush(fp); + exit_tweb (1); + } + + sprintf( title, "%s %s", filter, glob->la[36]); + fprintf( fp, HTML_HEAD_TITLE, title, glob->la[100]); + + disp_file(glob, glob->header, fp); + + fprintf( fp, + "<H2>%s</H2> %s <STRONG>%s</STRONG> in <STRONG>%s</STRONG></BODY></HTML>\n\n", + glob->la[37], glob->la[38], filter, + (strlen(base) == 0) ? glob->la[77] : ldap_dn2ufn(base)); + fflush(fp); + return( 0 ); + } + else if ( count == 1 ) { + e = ldap_first_entry( ld, res ); + if ( e != NULL ) { + char *dn, **oc; + oc = ldap_get_values(ld, e, "objectClass"); + dn = ldap_get_dn(ld, e); + if ( dn ) { + + /* GW-Switch if one search-result and dyn-URL by + PRINT_REDIRECT_HEADER */ + if ( glob->gw_switch->dynamic) { + char **uri, query[10*BUFSIZ]; + int j; + + uri = ldap_get_values( ld, e, "labeledURI" ); + for(j=0; uri && uri[j] && *uri[j]; j++) { + char *sp; + + if( ( sp = strchr(uri[j], ' ')) ) { + *sp++ = '\0'; + if(strstr(sp, glob->gw_switch->lagws)) { + /*sprintf(query, "%s/M%s", uri[j], dn);*/ + strcpy(query, uri[j]); + hex_decode(query); + PRINT_REDIRECT_HEADER; + PRINT_HTML_FOOTER; + exit_tweb(0); + } + } + } + } + /* By default on one result: */ + do_menu(ld, fp, dn, "", glob); + return (0); + } + } + } + + if (http == 1) + PRINT_HTML_HEADER; + if (request == HEAD) { + fflush(fp); + exit_tweb (1); + } + + sprintf( title2, "%s %s", glob->la[39], filter); + fprintf( fp, HTML_HEAD_TITLE, title2, glob->la[100]); + + disp_file(glob, glob->header, fp); + + ufn = friendly_dn(base, glob); + fprintf( fp, "%s <STRONG>\"%s\"</STRONG> in <STRONG>\"%s\"</STRONG> ", + glob->la[40], filter, ufn ); + if ( ufn ) free( ufn ); + + if(!glob->noauth) + fprintf( fp, "(%d %s)<br>", count, + count == 1 ? glob->la[70] : glob->la[71]); + + /* DO_SEARCH */ + counter = sort_result( ld, res, base, glob); + + /* get time for performance log */ + gettimeofday(×tore[4], NULL); + + list_output(fp, glob); + + if ( ldap_result2error( ld, res, 1 ) == LDAP_SIZELIMIT_EXCEEDED ) + do_sizelimit(fp, 0, glob); + + if(glob->legal && !glob->legal_top) + fprintf (fp, "%s\n%s\n", glob->la[101], + glob->is_proxy ? glob->la[104] : glob->la[65]); + + disp_file(glob, glob->footer, fp); + + PRINT_HTML_FOOTER; + + return( 0 ); + +} +/* end of function: do_search */ + + +PRIVATE pDISPLAY +find_dPtr( displayList, displayType ) +pDISPLAY displayList; +char *displayType; +{ + pDISPLAY dis; + + for ( dis = displayList; dis; dis = dis->next ) { + + if ( !strcasecmp( dis->ocs, displayType )) return( dis ); + + } + + return( NULL ); + +} /* find_dPtr */ + + +PUBLIC void do_read(ld, fp, dn, amore, glob) +LDAP *ld; +FILE *fp; +char *dn; +int amore; +GLOB_STRUCT *glob; +{ + int rc, j; + char **val, **s; + char *rdn; + LDAPMessage *res, *e; + struct timeval timeout; + int classFound; + pDISPLAY d_ptr = NULL; + pDISPLAY_LINE dis_ptr = NULL; + SORT_LINE *s_ptr; + char la_url[BUFSIZ]; + char *ufn; + char already_displayed[BUFSIZ]; + int header_attr_mode = 0; + +#if defined( TUE_TEL ) || defined( AMBIXGW ) + char *parentDN; +#endif + + + *already_displayed = ':'; + *(already_displayed+1) = '\0'; + + + timeout.tv_sec = glob->timeout; + timeout.tv_usec = 0; + + + if ( (rc = ldap_search_st( ld, dn, LDAP_SCOPE_BASE, "objectClass=*", + NULL, 0, &timeout, &res )) != LDAP_SUCCESS ) { + do_error(fp, rc, NOT_FOUND, glob); + return; + } + + + if ( (e = ldap_first_entry( ld, res )) == NULL ) { + do_error(fp, -2, SERVER_ERROR, glob); + return; + } + + val = ldap_get_values( ld, e, "objectClass" ); + +#if defined( TUE_TEL ) || defined( AMBIXGW ) + /* toc_derefalias: read entry, aliasedObjectName is referring to */ + if(charray_inlist(val, "toc_derefalias")){ + char **new_dn; + + new_dn = ldap_get_values( ld, e, "aliasedObjectName" ); + if(new_dn && new_dn[0]) { + do_read(ld, fp, new_dn[0], amore, glob); + return; + } + } + + /* before displaying check for dynamic changes of the sorting parms */ + parentDN = get_parentDN( dn ); + dynamicResort( ld, glob, parentDN ); +#endif + + /* + * check for objectClass via displayLists-Table which List + * of attributes we want to use. + */ + classFound = -1; + for(s_ptr = glob->sort; s_ptr; s_ptr = s_ptr->next) { + char buf[BUFSIZ]; + + d_ptr = s_ptr->display_class_ptr; + + for( j=0; val[j]; j++ ) { + sprintf( buf, "|%s|", str_tolower( val[j] )); + + if ( strstr( s_ptr->object_class, buf )) { + classFound = 1; + break; + } + } + if (classFound == 1) break; + } + +#if defined( TUE_TEL ) || defined( AMBIXGW ) + dynamicDisplay( ld, glob, parentDN, + s_ptr ? s_ptr->display_class : "default" ); +#endif + + if((classFound == -1) && (glob->default_display_type)) { + d_ptr = glob->default_display_type; + classFound = 1; + } + + /* if we did not find a fitting objectClass, simply return */ + if(classFound == -1) { + + fprintf( fp, HTML_HEAD_TITLE, glob->la[22], glob->la[100]); + fprintf( fp, "\n%s</BODY></HTML>", glob->la[41]); + return; + } + + /* is the display description defined already */ + if ( !d_ptr && (( d_ptr = find_dPtr( glob->display, + s_ptr->display_class )) == NULL )) { + + if ( dosyslog ) + syslog( LOG_INFO, + "do_read(%08d): couldn't find display type <%s> -- FATAL.", + glob->svc_cnt, s_ptr->display_class ); + + fprintf( fp, HTML_HEAD_TITLE, glob->la[22], glob->la[100]); + fprintf( fp, "\n%s</BODY></HTML>", glob->la[41]); + return; + + } + + /* now we can point to the final display screen */ + dis_ptr = ( amore ? d_ptr->second_page : d_ptr->first_page ); + + if (http == 1) PRINT_HTML_HEADER; + if (request == HEAD) { + fflush(fp); + exit_tweb (1); + } + + dn = ldap_get_dn( ld, e ); + + if ( strcmp( dn, "" ) != 0 ) { /* Not the root */ + s = ldap_explode_dn( dn, 1 ); + if ( s[1] == NULL ) /* toplevel */ + rdn = ldap_friendly_name( glob->friendlyfile, s[0], &fm ); + else + rdn = s[0]; + } else + rdn = glob->la[77]; + + fprintf( fp, HTML_HEAD_TITLE, ufn = friendly_dn( dn, glob ), + glob->la[100] ); + if ( ufn ) free( ufn ); + + disp_file(glob, glob->header, fp); + + if ( !glob->ldap_referral_mode ) { + + make_la_buttons("R", fp, ld, dn, la_url, glob); + make_header( fp, dn, 0, glob ); + } else { + fprintf( fp, glob->la[105]); + } + fprintf( fp, "<DL>"); + + fprintf( fp, glob->la[101]); + + /* don't display rdn if first attribute is in header-mode */ + if ( dis_ptr->ty == HEADER ) + header_attr_mode = 1; + if( ( dis_ptr && !header_attr_mode ) || !dis_ptr ) { + if(glob->strip_pin && strstr(glob->strip_pin, d_ptr->ocs)) { + char rdnstriped[BUFSIZ]; + + strcpy( rdnstriped, rdn); + trimright (rdnstriped, " 1234567890"); + fprintf( fp, "<H1>%s</H1>", rdnstriped ); + } else + fprintf( fp, "<H1>%s</H1>", rdn); + } + + if(glob->ind_attrs) + get_ref_attrs( ld, dn, e, glob ); + + /* get time for performance log */ + items_displayed = 1; + gettimeofday(×tore[4], NULL); + + if ( header_attr_mode ) + rdn = NULL; + + for( ; dis_ptr; dis_ptr = dis_ptr->next) { + + if(glob->ind_attrs){ + + int n, m, iatlabel=0, replace=0; + IND_ATTR_ARR *vnodes; + +#ifdef TUE_TEL + int retcode = 0; + + /* Function Mode */ + retcode = displayTueRefPhone( ld, fp, dn, dis_ptr, + e, rdn, glob, already_displayed ); +#endif + if(strstr(already_displayed, dis_ptr->label)) { + continue; + } + + vnodes = glob->ind_attrs->valid_nodes; + + for(n=0; vnodes && vnodes[n].key && *(vnodes[n].key) ; n++) { + + if(!strcasecmp(vnodes[n].attr, dis_ptr->attribute)) { + + for(m=0; vnodes[n].e[m]; m++) + print_attr( vnodes[n].ld, fp, dn, + m==0 ? dis_ptr->label : "", dis_ptr->attribute, + vnodes[n].e[m], dis_ptr->ty, rdn, glob); + + iatlabel = 1; + if(vnodes[n].replace) + replace=1; + + } + + } + if( iatlabel && !replace) + print_attr( ld, fp, dn, "", + dis_ptr->attribute, e, dis_ptr->ty, rdn, glob); + + if(!iatlabel) + print_attr( ld, fp, dn, dis_ptr->label, + dis_ptr->attribute, e, dis_ptr->ty, rdn, glob); + + } else { + print_attr( ld, fp, dn, dis_ptr->label, + dis_ptr->attribute, e, dis_ptr->ty, rdn, glob); + } + } + + + if ( !amore && d_ptr && d_ptr->second_page ) { + + fprintf( fp, "</DL><A HREF=\"/L%s\"><B>%s</B></A>\n", + hex_encode(dn), glob->la[42]); + + + } + fprintf( fp, "</DL>\n"); + + if (strcasecmp(dn + strlen(dn) - strlen(glob->basedn->dn), + glob->basedn->dn) == 0) { + + pMODIF p_mod; + char *aoc; + char **oc; + + aoc = make_oc_to_string(oc = ldap_get_values( ld, e, "objectClass" )); + + if(!strlstcmp (aoc, glob->no_modify, '|')) { + for (p_mod = glob->modify; aoc && p_mod; p_mod = p_mod->next) { + if (strlstcmp (aoc, p_mod->ocs, '|')) { + fprintf( fp, "%s<TT>%s</TT><P><FORM ACTION=\"F%s\">\n", + glob->la[101], glob->la[43], hex_encode(dn)); + fprintf (fp, "%s <INPUT TYPE=\"password\" ", + glob->la[44]); + fprintf (fp, "NAME=\"userPassword\"><BR>%s ", + glob->la[45]); + fprintf (fp, "<INPUT TYPE=\"submit\" VALUE=\"%s\">", + glob->la[47]); + fprintf (fp, " %s. </FORM>\n", + glob->la[48]); + break; + } + } + } + + ldap_value_free( oc ); + + } + + /* Button leading to cgi-script */ + if( glob->form_button ){ + char **oc; + + oc = ldap_get_values( ld, e, "objectClass" ); + disp_form_button(1, oc, dn, ld, fp, glob); + } + + disp_file(glob, glob->footer, fp); + + PRINT_HTML_FOOTER; + +} +/* end of function: do_read */ + +PRIVATE void disp_form_button(read_menu, oc, dn, ld, fp, glob) +int read_menu; +char **oc; +char *dn; +LDAP *ld; +FILE *fp; +GLOB_STRUCT *glob; +{ + pFORM_BUTTON fo_ptr; + char dn_used[BUFSIZ], button_label[BUFSIZ]; + +#ifdef AMBIXGW + char *who_val; + char **selfInsertWho = NULL; + char **studie = NULL; + int selfInsReadFlag = 0; +#endif + + for(fo_ptr = glob->form_button; fo_ptr; fo_ptr = fo_ptr->next) { + if(read_menu != fo_ptr->read_menu || + ( !charray_inlist(oc, fo_ptr->object_class) + && strncasecmp( "cn=", fo_ptr->object_class, 3 ) ) ) + continue; + strcpy(dn_used, dn); + strcpy(button_label, fo_ptr->button_label); + +#ifdef AMBIXGW + /* new-AMBIX cn=Selbst-Eintrag etc. support */ + /* object-class field contains here cn=xyz e.g. cn=Selbst-Eintrag */ + if ( !strncasecmp( "cn=", fo_ptr->object_class, 3 )) { + char dn_buf[BUFSIZ]; + LDAPMessage *res, *e; + struct timeval timeout; + static char *attrs[] = { "objectClass", "selfInsertWho", + "studie", 0 }; + + /* cn=Selbsteintrag nur einmal lesen */ + if (!selfInsReadFlag ) { + selfInsReadFlag = 1; + + timeout.tv_sec = glob->timeout; + timeout.tv_usec = 0; + + sprintf(dn_buf, "%s,%s", fo_ptr->object_class, dn); + if (ldap_search_st( ld, dn_buf, LDAP_SCOPE_BASE, "objectClass=*", + attrs, 0, &timeout, &res ) != LDAP_SUCCESS ) + continue; + if(( e = ldap_first_entry( ld, res )) == NULL ) + continue; + + selfInsertWho = ldap_get_values( ld, e, "selfInsertWho" ); + studie = ldap_get_values( ld, e, "studie" ); + } + + if ( (who_val = strchr(button_label, '|'))) + *who_val++ = '\0'; + + if ( !who_val ) + continue; + + if ( !selfInsertWho || !selfInsertWho[0] ) + continue; + + /* exception for all + studiedn != dn -> two buttons stud + ang */ + if ( strcasecmp(selfInsertWho[0], who_val ) && + !(!strcasecmp(selfInsertWho[0], "all") && studie && studie[0] && dn_cmp(dn, studie[0]) && strcasecmp(who_val, "all"))) + continue; + + /* filter for exception all-button */ + if( studie && studie[0] && dn_cmp(dn, studie[0]) && !strcasecmp(selfInsertWho[0], "all") && !strcasecmp(who_val, "all") ) + continue; + + if(!strcasecmp(who_val, "stud" ) && studie && studie[0] + && dn_cmp(dn, studie[0])) + strcpy(dn_used, studie[0]); + } +#endif + + fprintf (fp, "<FORM METHOD=%s ACTION=%s>\n", fo_ptr->method, + fo_ptr->script_url); + fprintf (fp, "%s\n<INPUT type=hidden name=\"%s\" value=\"%s\">\n", + fo_ptr->text, fo_ptr->dn_name, hex_encode(dn_used)); + fprintf (fp, "<INPUT TYPE=\"submit\" name=\"%s\" value=\"%s\">\n", + fo_ptr->form_name, button_label); + fprintf (fp, "</FORM>\n"); + } +} +/* end of function: disp_form_button */ + + +PUBLIC void do_form(ld, fp, query, glob) +LDAP *ld; +FILE *fp; +char *query; +GLOB_STRUCT *glob; +{ + int rc, count; + char *dn = query, *pw; + char *ufn; + char *a; + LDAPMessage *res, *e; + struct timeval timeout; + pMODIFY_LINE mod_ptr; + char title[BUFSIZ]; + + + if ( (pw = strchr( dn, '?' )) == NULL ) { + fprintf( fp, "%s<br>", glob->la[49]); + exit_tweb( 1 ); + } + *pw++ = '\0'; + if (strncmp(pw, "userPassword=", 13) == 0) + pw += 13; + else { + fprintf( fp, "%s %s!<br>", glob->la[50], pw); + exit_tweb ( 1 ); + } + if (strlen(pw) == 0) { + /* we need a password for simple auth */ + do_error( fp, LDAP_INVALID_CREDENTIALS, FORBIDDEN, glob); + rewind(fp); + exit_tweb( 1 ); + } + if ( (rc = ldap_simple_bind_s( ld, dn, pw )) != LDAP_SUCCESS ) { + if ( debug ) ldap_perror( ld, "ldap_simple_bind_s" ); + do_error( fp, rc, FORBIDDEN, glob); + return; + } + if (debug) fprintf(stderr, "BOUND as %s\n", dn); + timeout.tv_sec = glob->timeout; + timeout.tv_usec = 0; + if ( (rc = ldap_search_st( ld, dn, LDAP_SCOPE_BASE, "objectClass=*", + 0, 0, &timeout, &res )) != LDAP_SUCCESS ) { + do_error(fp, rc, NOT_FOUND, glob); + return; + } + if ( (e = ldap_first_entry( ld, res )) == NULL ) { + do_error(fp, -2, SERVER_ERROR, glob); + return; + } + dn = ldap_get_dn( ld, e ); + ufn = ldap_dn2ufn( dn ); + if (http == 1) { + PRINT_HTML_HEADER; + } + sprintf( title, "%s %s", glob->la[51], ufn ); + fprintf( fp, HTML_HEAD_TITLE, title, glob->la[100] ); + + disp_file(glob, glob->header, fp); + + fprintf( fp, "<FORM ACTION=\"Y%s\">\n<INPUT TYPE= \"radio\" ", hex_encode(dn)); + fprintf( fp, "NAME=\"oldPassword\" VALUE=\"%s\" CHECKED><TT>%s</TT>\n<H1>%s</H1><DL><br>", hex_encode(pw), glob->la[53], ufn ); + free( ufn ); + for(mod_ptr = glob->modify->modattr; mod_ptr; mod_ptr = mod_ptr->next){ + a = mod_ptr->attribute; + count = mod_ptr->count; + if ( strcmp( a, "homepostaladdress" ) == 0 + || strcmp( a, "postaladdress" ) == 0) + if (count == 0) + print_attr(ld,fp,dn,mod_ptr->label,a,e,MULTILINE,NULL, glob); + else + form_attr(ld,fp,mod_ptr->label,a,e,1,count, glob); + else if (count == 0) + print_attr( ld, fp, dn, mod_ptr->label, a, e, DEFAULT, NULL, glob); + else + form_attr( ld, fp, mod_ptr->label, a, e, 0, count, glob ); + } + fprintf( fp, "</DL><InPut TYPE=\"reset\" VALUE=\"%s\"> ", glob->la[72]); + fprintf( fp, "<InPut TYPE=\"submit\" VALUE=\"%s\">", glob->la[47]); + fprintf( fp, "</FORM>"); + + disp_file(glob, glob->footer, fp); + + PRINT_HTML_FOOTER; + fflush(fp); +} +/* end of function: do_form */ + + +PUBLIC void do_modify(ld, fp, query, glob) +LDAP *ld; +FILE *fp; +char *query; +GLOB_STRUCT *glob; +{ + char *dn, *ufn, *pw, *what, *next, *val, *oldval, *cp; + int rc, changes = 0, delete_flag; + static char *value1[2], *value2[2]; + static LDAPMod mod1, mod2; + static LDAPMod *mods[3] = { &mod1 , &mod2, NULL}; + char title[BUFSIZ]; + +/* Patch: we can't run the modification of attributes in two distinct steps, + since inheritage might copy a value into the entry after deletion + of the old value + + /KSp, 95/07/13 +*/ + + + /* query: DN?oldPassword=oldpw&att1=oldval1=val1&att2=oldval2=val2&... + * or: DN?oldPassword=oldpw&att1%3Doldval1=val1&att2%3Doldval2=... + */ + + dn = query; + rewind(fp); + + if ( (what = strchr( dn, '?' )) == NULL ) { + explain_error( fp, glob->la[93], BAD_REQUEST, glob ); + exit_tweb( 1 ); + } + *what++ = '\0'; + hex_decode(dn); + if (debug) fprintf(stderr, "What: %s\n", what); + /* At first there should be the old userPassword */ + if ( (pw = strstr( what, "oldPassword")) == NULL ) { + explain_error( fp, glob->la[94], BAD_REQUEST, glob); + exit_tweb ( 1 ); + } + pw += 12; /* strlen("oldPassword") + 1 */ + /* skip to the first real attribute */ + if ( (what = strchr(pw, '&')) == NULL ) { + explain_error( fp, glob->la[95], BAD_REQUEST, glob); + exit_tweb( 1 ); + } + *what++ = '\0'; + hex_qdecode(pw); + if (debug) fprintf(stderr, + "\ndo_modify: DN = %s PW = ####### CONTENT =\n%s\n ", dn, what ); + if ( (rc = ldap_simple_bind_s( ld, dn, pw )) != LDAP_SUCCESS ) { + if ( debug ) ldap_perror( ld, "ldap_simple_bind_s" ); + do_error( fp, rc, FORBIDDEN, glob); + exit_tweb( 1 ); + } + if (debug) fprintf(stderr, "BOUND as %s.\n", dn); + + if (http == 1) { + PRINT_HTML_HEADER; + } + + if (request == HEAD) { + fflush(fp); + exit_tweb (1); + } + ufn = ldap_dn2ufn( dn ); + sprintf( title, "%s %s", glob->la[8], ufn); + fprintf(fp, HTML_HEAD_TITLE, title, glob->la[100]); + + disp_file(glob, glob->header, fp); + + fprintf(fp, "<H2>%s %s</H2>%s<DL>\n", glob->la[9], ufn, glob->la[10]); + free(ufn); + + while (what) { + if ((next = strchr(what, '&')) != NULL) { + *next++ = '\0'; + } else { /* last in query */ + next = NULL; + } + if ((val = strrchr(what, '=')) == NULL) { + /* new value */ + fprintf( fp, "<P>%s ", glob->la[54]); + fprintf( fp, "%s %s!<P>", glob->la[55], hex_qdecode(what)); + exit_tweb (1); + } + *val++ = '\0'; + hex_qdecode(what); + hex_qdecode(val); + if ((oldval = strchr(what, '=')) == NULL) { + /* old value */ + fprintf( fp, "<P>%s ", glob->la[56]); + fprintf( fp, "%s %s!<P>\n", glob->la[55], what); + exit_tweb (1); + } + *oldval++ = '\0'; + if (strcmp(oldval, val) == 0 ) { /* no changes */ + what = next; + continue; + } + if ((strcasecmp(what, "homePostalAddress") == 0) || + (strcasecmp(what, "postalAddress") == 0)) { + /* multiline */ + cp = oldval; + while ((cp = strchr(cp, '\n')) != NULL) *cp = '$'; + cp = val; + while ((cp = strchr(cp, '\n')) != NULL) *cp = '$'; + } + if (debug) + fprintf(stderr, + "what = %s, oldval = %s, val = %s\n", + what, oldval, val); + + /* there is something to do: + * - delete the old value + * - add the new value if not empty */ + mod1.mod_type = what; + mod2.mod_type = what; + value1[1] = NULL; + value2[1] = NULL; + mod1.mod_values = value1; + mod2.mod_values = value2; + mods[1] = NULL; + delete_flag = FALSE; + +/* ############# */ + + if (strlen(oldval) > 0) { + + if (strlen (val) > 0) { + + mod1.mod_op = LDAP_MOD_ADD; + value1[0] = val; + +/* mod2.mod_op = LDAP_MOD_DELETE; + value2[0] = oldval; + mods[1] = &mod2; +*/ + if ((rc = ldap_modify_s(ld, dn, mods)) != LDAP_SUCCESS) { + + fprintf( fp, + "%s <TT>%s</TT> %s <TT>%s</TT>!<P>\n<EM> %d: %s.</EM><p>\n", + glob->la[80], oldval, glob->la[81], what, + rc, ldap_err2string(rc)); + + what = next; + continue; + + } + + mod1.mod_op = LDAP_MOD_DELETE; + value1[0] = oldval; + + } else { + + mod1.mod_op = LDAP_MOD_DELETE; + value1[0] = oldval; + delete_flag = TRUE; + + } + + } else { + + mod1.mod_op = LDAP_MOD_ADD; + value1[0] = val; + + } + + if (debug) + fprintf(stderr, "trying: %s = %s.\n", what, val); + + if (((rc=ldap_modify_s(ld, dn, mods)) != LDAP_SUCCESS) && + (mod1.mod_op != LDAP_MOD_DELETE) && (rc != LDAP_NO_SUCH_ATTRIBUTE)){ + +if (dosyslog) + syslog (LOG_INFO, "ERROR: ldap_modify_s: ADD\n"); + if ( debug ) + ldap_perror( ld, "ldap_modify_s: ADD"); + fprintf( fp, + "%s <TT>%s</TT> %s <TT>%s</TT><P>\n%s <EM> %d: %s.</EM><P>\n", + glob->la[57], val, glob->la[58], what, glob->la[59], + rc, ldap_err2string( rc ) ); + if (strlen(oldval) > 0 && rc != LDAP_INSUFFICIENT_ACCESS) { + /* try to reset to old value */ + + mod1.mod_op = LDAP_MOD_ADD; + mods[1] = NULL; + + value1[0] = oldval; + if ((rc = ldap_modify_s(ld, dn, mods)) != LDAP_SUCCESS) { + fprintf( fp, + "%s <TT>%s</TT> %s <TT>%s</TT>!<P>\n<EM> %d: %s.</EM><P>\n", + glob->la[60], oldval, glob->la[61], what, + rc, ldap_err2string(rc)); + + exit_tweb( 1 ); + } else { + fprintf( fp, "%s <TT>%s</TT> %s <TT>%s</TT><P>\n", + glob->la[62], oldval, glob->la[61], what); + } + } + what = next; + continue; + } + + if (debug) fprintf(stderr, "MOD: %s = %s.\n", what, val); + changes++; + fprintf(fp, "<DT><B>%s</B> <DD>%s <TT>(%s)</TT>\n", + ldap_friendly_name(glob->friendlyfile, what, &fm), value1[0], + delete_flag ? glob->la[74] : strlen(oldval) > 0 ? + glob->la[75] : glob->la[76]); + what = next; + } + fprintf(fp, "</DL>%d %s%s%s!\n", changes, glob->la[15], + changes != 1 ? glob->la[73] : "", + changes > 0 ? glob->la[16] : ""); + if (changes > 0) { + char *dn2 = hex_encode(dn); + + fprintf(fp, "<UL><LI><B><A HREF=\"/R%s\">%s</A>\n", + dn2, glob->la[17]); + fprintf(fp, "<LI><A HREF=\"/F%s?userPassword=%s\">%s</A></B></UL>\n", + dn2, pw, glob->la[19]); + + } + + disp_file(glob, glob->footer, fp); + + PRINT_HTML_FOOTER; + fflush(fp); +} +/* end of function: do_modify */ + +PRIVATE int no_show( rdn, glob) +char *rdn; +GLOB_STRUCT *glob; +{ + if ( glob->no_show_rdn ) { + + char rdn_cpy[BUFSIZ], *toc, no_sh[BUFSIZ]; + + strcpy(no_sh, glob->no_show_rdn); + sprintf(rdn_cpy, "|%s|", rdn); + toc = strtok(no_sh, " "); + do { + if(strstr(str_tolower((char *) rdn_cpy), str_tolower(toc))) + return(TRUE); + } while( ( toc = strtok(NULL, " ")) ); + + } + + return(FALSE); +} +/* end of function: no_show */ + + +PRIVATE int sort_result(ld, res, dn, glob) +LDAP *ld; +LDAPMessage *res; +char *dn; +GLOB_STRUCT *glob; +{ + LDAPMessage *e; + char *ufn; + int counter = 0, baselen; + int basecount; + pSORT_LINE s_ptr; + pMY_LDAP_LIST lmptr; + LFP getfirst = glob->prefer_ref_uris ? my_first_entry : ldap_first_entry, + getnext = glob->prefer_ref_uris ? my_next_entry : ldap_next_entry; + + hex_decode (dn); + + ufn = ldap_dn2ufn(dn); + baselen = ufn ? strlen(ufn) : 0; + basecount = ufn ? chrcnt(ufn, UFNSEP) : 0; + +#if defined( TUE_TEL ) || defined( AMBIXGW ) + /* before sorting check for dynamic changes of the sorting instructions */ + dynamicResort( ld, glob, dn ); +#endif + + for ( e = (*getfirst)(ld, res); e != NULL && counter < glob->maxcount; + e = (*getnext)(ld, e ) ) { + sort_parse(ld, e, dn, ufn, baselen, basecount, counter, glob); + } + for(lmptr = mllroot; lmptr; lmptr = lmptr->next) { + sort_parse(ld, lmptr->e, dn, ufn, baselen, basecount, counter, glob); + } + mllroot = NULL; + + for(s_ptr = glob->sort; s_ptr; s_ptr = s_ptr->next) { + if( s_ptr->dnLast ) + qsort(s_ptr->dnList, s_ptr->dnLast, sizeof(int), compare); + } + return counter; +} +/* end of function: sort_result */ + + +PRIVATE void list_output(fp, glob) +FILE *fp; +GLOB_STRUCT *glob; +{ + int i, x; + pSORT_LINE s_ptr; + + if(glob->tables_marker) + fprintf (fp, "</H3><TABLE WIDTH=\"100%%\">"); + + for (i = 0 ; i < MAX_OCS ; i++ ) { + if(!glob->sorty[i]) continue; + s_ptr = glob->sorty[i]; + + if(glob->tables_marker) + fprintf( fp, "<TR><TH ALIGN=LEFT><BR>"); + + fprintf( fp, "<H3>%s", s_ptr->label); + +#ifdef TUE_TEL + if(glob->ton_urls && glob->ton_urls->department + && (strlen(s_ptr->label) >1) ) + fprintf( fp, " / %s", glob->ton_urls->department); +#endif + + if(s_ptr->restricted) { + fprintf( fp, " %s", glob->la[33]); + if (glob->legal && !glob->legal_top) + fprintf( fp, ", %s", glob->la[34]); + fprintf (fp, ")"); + } + + if(glob->tables_marker) + fprintf (fp, "</H3></TH></TR>"); + else + fprintf (fp, "</H3><MENU>\n"); + + for(x=0; x < s_ptr->dnLast; x++) { + if(glob->strip_pin && strstr(glob->strip_pin, s_ptr->object_class)){ + s_ptr->dnList[x]->href[strlen(s_ptr->dnList[x]->href) -5] = '\0'; + trimright (s_ptr->dnList[x]->href, " 1234567890"); + strcat(s_ptr->dnList[x]->href, "</A>\n"); + } + + if( glob->raw_data ) { + fprintf(fp,"%s",s_ptr->dnList[x]->raw); + free(s_ptr->dnList[x]->raw); + } else { + fprintf(fp,"%s",s_ptr->dnList[x]->href); + free(s_ptr->dnList[x]->href); + } + free(s_ptr->dnList[x]->string); + } + + if(!glob->tables_marker) + fprintf (fp, "</MENU>\n"); + + glob->sorty[i] = NULL; + } + if(glob->tables_marker) + fprintf (fp, "</TABLE>\n"); +} +/* end of function: list_output */ + +PRIVATE void make_la_buttons(sep, fp, ld, dn, la_url, glob) +char *sep; +FILE *fp; +LDAP *ld; +char *dn; +char *la_url; +GLOB_STRUCT *glob; + +{ + int k; + + /* Inform users from unknown */ + if(glob->unknown_host) fprintf( fp, glob->la[102]); + + if(glob->legal && glob->legal_top) + fprintf (fp, "%s\n%s\n", + glob->is_proxy ? glob->la[104] : glob->la[65], glob->la[101]); + + /* if allowed -> allow-file-message */ + if(glob->allowed && glob->allow_msg) + disp_file(glob, glob->allow_msg, fp); + + if(glob->pull_down_menus) { + make_la_buttons_pull_down(sep, fp, ld, dn, la_url, glob); + return; + } + + fprintf( fp, "<B>"); + fprintf( fp, " [ <A HREF=\"/H\">%s</A> ] ",glob->la[29]); + for(k=0; k<strlen(glob->olang); k++){ + if(glob->olang[k] == glob->lang[0]) continue; + sprintf(la_url, "http://%s:%d/%s%s", + glob->hostname, glob->webport+glob->olang[k]-'0', + sep, hex_encode(dn)); + fprintf( fp, " [ <A HREF=\"%s\"> %s </A> ] ", + la_url, glob->language[glob->olang[k]-'0']); + } + fprintf( fp, "</B><p>"); +} +/* end of function: make_la_buttons */ + +PRIVATE void make_la_buttons_pull_down(sep, fp, ld, dn, la_url, glob) +char *sep; +FILE *fp; +LDAP *ld; +char *dn; +char *la_url; +GLOB_STRUCT *glob; + +{ + int k; + TABLE_DISPLAY *tab_ptr; + + fprintf( fp, "<FORM ACTION=\"/B\">\n"); + fprintf( fp, "<INPUT TYPE=SUBMIT NAME=H Value = \"%s\">\n",glob->la[29]); + + fprintf( fp, "_\n"); + + for(k=0; k<strlen(glob->olang); k++){ + if(glob->olang[k] == glob->lang[0]) continue; + sprintf(la_url, "http://%s:%d/%s%s", + glob->hostname, glob->webport+glob->olang[k]-'0', + sep, hex_encode(dn)); + fprintf( fp, "<INPUT TYPE=SUBMIT NAME=%s Value = \"%s\">\n", + la_url, glob->language[glob->olang[k]-'0']); + } + + /* make tables button in order to have table-display requests */ + for(tab_ptr = glob->tables; tab_ptr; tab_ptr = tab_ptr->next) { + + char **oc = NULL; + struct timeval timeout; + LDAPMessage *res; + static char *attrs[] = { "objectClass", 0 }; + + if( !((!tab_ptr->allow || glob->allowed) && !glob->tables_marker)) + continue; + + /* Check objectclass for tables_oc */ + timeout.tv_sec = glob->timeout; + timeout.tv_usec = 0; + if ( ldap_search_st( ld, dn, LDAP_SCOPE_BASE, "objectClass=*", + attrs, 0, &timeout, &res ) == LDAP_SUCCESS ){ + oc = ldap_get_values(ld, ldap_first_entry(ld, res), "objectClass"); + } + if ( oc && charray_inlist( oc, tab_ptr->select_oc)) { + + fprintf( fp, "_______\n"); + fprintf( fp, "<INPUT TYPE=SUBMIT NAME=X%s?%s#%s Value = \"%s\">\n", + hex_encode(dn), +#ifdef TUE_TEL + strstr(tab_ptr->dn_extension, "persontable") ? + "MENU" : "PHONEBOOK", +#else + "MENU", +#endif + tab_ptr->dn_extension, tab_ptr->button_label); + } + } + + fprintf( fp, "</FORM>\n"); +} +/* end of function: make_la_buttons_pull_down */ + +PRIVATE void print_rdn(fp, dn, glob) +FILE *fp; +char *dn; +GLOB_STRUCT *glob; +{ + char **s; + char *rdn = NULL; + + if(glob->pull_down_menus) { + print_rdn_pull_down(fp, dn, glob); + return; + } + + s = ldap_explode_dn( dn, 1 ); + if ( strcmp( dn, "" ) != 0 ) { /* Not the root */ + if ( s[1] == NULL ) { /* toplevel */ + rdn = ldap_friendly_name( glob->friendlyfile, s[0], &fm ); + } else { + rdn = s[0]; + } + fprintf( fp,"%s <B><A HREF=\"/R%s\">%s</A></B>\n",glob->la[28],hex_encode(dn),rdn?rdn:s[0]); + } else { /* the root */ + fprintf( fp, "<B>%s</B>\n", glob->la[77]); + } + ldap_value_free( s ); +} +/* end of function: print_rdn */ + +PRIVATE void print_rdn_pull_down(fp, dn, glob) +FILE *fp; +char *dn; +GLOB_STRUCT *glob; +{ + char **s; + char *rdn = NULL; + + fprintf( fp, "<FORM ACTION=\"/B\">\n"); + + s = ldap_explode_dn( dn, 1 ); + if ( strcmp( dn, "" ) != 0 ) { /* Not the root */ + if ( s[1] == NULL ) { /* toplevel */ + rdn = ldap_friendly_name( glob->friendlyfile, s[0], &fm ); + } else { + rdn = s[0]; + } + fprintf( fp,"%s <BIG><STRONG>%s</STRONG></BIG> ", + glob->la[28], rdn?rdn:s[0]); + fprintf( fp, "<INPUT TYPE=SUBMIT NAME=R%s Value = \"%s\">\n", + hex_encode(dn), glob->la[98]); + } else { /* the root */ + fprintf( fp, "<BIG><STRONG>%s</STRONG></BIG>\n", glob->la[77]); + } + ldap_value_free( s ); + fprintf( fp, "</FORM>\n"); +} +/* end of function: print_rdn_pull_down */ + +PRIVATE void make_search_box(fp, ld, dn, glob) +FILE *fp; +LDAP *ld; +char *dn; +GLOB_STRUCT *glob; +{ + int scope; + + scope = make_scope(ld, dn, glob); /* onelevel or subtree search ? */ + fprintf( fp, "<DL><DT><FORM ACTION=\"/S%s\">%s <inPUT NAME=\"%s\"><INPUT TYPE=submit VALUE=%s><INPUT TYPE=reset VALUE=\"%s\">\n", + hex_encode(dn), + scope == LDAP_SCOPE_ONELEVEL ? glob->la[66] : glob->la[67], + scope == LDAP_SCOPE_ONELEVEL ? "O" : "S", + glob->la[68], glob->la[69]); + + fprintf( fp, "</FORM></DL>\n"); +} +/* end of function: make_search_box */ + +PRIVATE LDAPMessage *my_first_entry( ld, e ) +LDAP *ld; +LDAPMessage *e; +{ + return(ldap_list_eval(ld, e , ldap_first_entry)); +} +/* end of function: my_first_entry */ + +PRIVATE LDAPMessage *my_next_entry(ld, e ) +LDAP *ld; +LDAPMessage *e; +{ + return(ldap_list_eval(ld, e , ldap_next_entry)); +} +/* end of function: my_next_entry */ + +PRIVATE LDAPMessage *ldap_list_eval(ld, e, funcp ) +LDAP *ld; +LDAPMessage *e; +LFP funcp; +{ + + char **value = NULL; + pMY_LDAP_LIST *lmhandle; /* , lmptr; */ + + for(lmhandle = &mllroot; *lmhandle; lmhandle = &(*lmhandle)->next) + ; + + for( e = (*funcp)( ld, e ) ; + e && strstr(make_oc_to_string(value = ldap_get_values( ld, e, "objectClass" )), + "|alias|"); e = ldap_next_entry( ld, e )) { + *lmhandle = (pMY_LDAP_LIST) ch_malloc(sizeof(MY_LDAP_LIST)); + (*lmhandle)->e = e; + lmhandle = &(*lmhandle)->next; + ldap_value_free(value); + value = NULL; + + } + if (value) ldap_value_free(value); + +/* if(!e) { + for(lmptr = mllroot; lmptr; lmptr = lmptr->next) { + char **val; + + val = ldap_get_values(ld, lmptr->e, "aliasedObjectName"); +if (dosyslog) syslog (LOG_INFO, "alias: %s", val[0]); + ldap_value_free(val); + } + mllroot = NULL; + } +*/ + return(e); +} +/* end of function: ldap_list_eval */ + +PRIVATE void sort_parse(ld, e, dn, ufn, baselen, basecount, counter, glob) +LDAP *ld; +LDAPMessage *e; +char *dn; +char *ufn; +int baselen; +int basecount; +int counter; +GLOB_STRUCT *glob; +{ + char **s, **oc; + char *dn2, *urldn = NULL, *rdn, *doc, *aoc; + char *ufn2, *sortstring = NULL, *cp; + char **sattr = NULL, href[20*BUFSIZ], *temp; + int spaces = 0, iscountry; + pGW_SWITCH_LINE gw_ptr; + int flag, found_oc, i; + pSORT_LINE *s_hndl; + pSORT_LINE s_ptr; + char *url = NULL; + char **uri = NULL, *urlnola, raw_string[BUFSIZ]; + + oc = ldap_get_values( ld, e, "objectClass" ); + + if(!(aoc = make_oc_to_string(oc))) return; + + +#ifdef TUE_TEL + /*** ton_urls ***/ + if(glob->ton_urls && glob->ton_urls->value && strstr(aoc, "|person|")) { + char **tonvals; + int k, matched; + + matched=0; + tonvals = ldap_get_values( ld, e, glob->ton_urls->attribute); + if(!tonvals) return; + for(k=0; tonvals[k]; k++) { + if(strstr(tonvals[k], glob->ton_urls->value) + && !(strchr(tonvals[k], '.') + && (strcspn(tonvals[k],".") > strlen(glob->ton_urls->value)))){ + matched = 1; + } + } + if(!matched) { + return; + } + } +#endif + + /* Begin New Sort */ + found_oc = FALSE; + i = 0; + for(s_hndl = &(glob->sort); *s_hndl; s_hndl = &(*s_hndl)->next) { + + i++; + if(strstr( aoc, (*s_hndl)->object_class )) { + + if(strstr(aoc, "|person|") && glob->no_browse) + goto NEXTENTRY; + found_oc = TRUE; + } + if(found_oc) break; + } + + if(!found_oc) { + if(glob->show_defoc) { + *s_hndl = s_ptr = (pSORT_LINE) ch_malloc(sizeof(SORT_LINE)); + s_ptr->object_class = strdup(pick_oc(oc)); + s_ptr->label = ldap_friendly_name(glob->friendlyfile, + s_ptr->object_class, &fm); + s_ptr->priority = i; + + } else return; + } + + s_ptr = *s_hndl; + doc = s_ptr->object_class; + + dn2 = ldap_get_dn( ld, e ); + if(urldn) free(urldn); + if(strstr(aoc, "|alias|")) { + + char **val; + + val = ldap_get_values(ld, e, "aliasedObjectName"); + urldn = strdup(hex_encode(val[0])); + ldap_value_free(val); + + } else + urldn = strdup(hex_encode(dn2)); + + ufn2 = strdup (ldap_dn2ufn(dn2)); + s = ldap_explode_dn( dn2, 1 ); + + if(baselen) + ufn2 = dnrcut(ufn2, UFNSEP, basecount); + + /* Support raw data delivery */ + if(glob->raw_data) { + char **rvals; + int k, l; + + sprintf(raw_string, "%s", ufn2); + trimright (raw_string, " 1234567890"); + + for(l=0; glob->raw_attrs[l]; l++) { + rvals = ldap_get_values( ld, e, glob->raw_attrs[l]); + if(rvals[0]) + sprintf(raw_string, "%s%% %s=", raw_string, glob->raw_attrs[l]); + for(k=0; rvals[k]; k++) { + sprintf(raw_string, "%s%s%s",raw_string, + k>0 ? "&":"", rvals[k] ); + } + } + sprintf(raw_string, "%s|<br><br>", raw_string); + } + + iscountry = (strstr( doc, "country" ) != NULL); + if ( iscountry ) { + rdn = ldap_friendly_name( glob->friendlyfile, s[0], &fm ); + sortstring = ufn2 = ldap_friendly_name( glob->friendlyfile, + ufn2, &fm ); + sattr = NULL; + } else + rdn = s[0]; + if ( rdn == NULL ) + rdn = s[0]; + if (( strncasecmp( rdn, "{ASN}", 5 ) == 0 ) + || no_show( rdn, glob)) { + free( dn2 ); + ldap_value_free( s ); + ldap_value_free( oc ); + return; + } + if ( !iscountry ) { /* not a country */ + sattr = ldap_get_values( ld, e, s_ptr->sort_attr); + sortstring = strdup(dn2); + if ( ( cp = strchr(sortstring,'=')) ) { + sortstring = ++cp; + /* DNs may have components in '"', ignored when sorting */ + if ( *sortstring == '"' ) + sortstring++; + } + if ( sattr ) { + cp = *sattr; + while ( ( cp = strchr(cp,' ')) ) { + cp ++; + spaces ++; + } + } + while ( spaces > 0 ) { + if ( ( cp = strrchr(sortstring,' ')) ) { + *cp = '\0'; + spaces --; + } + } + } + + ufn2 = trim(ufn2, "\""); + + /* GW-SWITCH */ + flag = 0; + urlnola = NULL; + + if (glob->gw_switch && glob->gw_switch->dynamic) { + + uri = ldap_get_values( ld, e, "labeledURI" ); + + /* PREFER-REF-URIS Code */ + if(strstr(aoc, "|alias|") && glob->prefer_ref_uris){ + + LDAPMessage *ures, *ue; + struct timeval timeout; + char **val; + + timeout.tv_sec = glob->timeout; + timeout.tv_usec = 0; + +#if defined LDAP_VENDOR_NAME && defined LDAP_API_VERSION +# if LDAP_API_VERSION > 2001 && LDAP_API_VERSION < 2010 + + ldap_set_option( ld, LDAP_OPT_DEREF, LDAP_DEREF_ALWAYS ); + +# endif +#else + ld->ld_deref = LDAP_DEREF_ALWAYS; +#endif + + if ( (ldap_search_st( ld, dn2, LDAP_SCOPE_BASE, "objectClass=*", + NULL, 0, &timeout, &ures )) == LDAP_SUCCESS ) { + if ( (ue = ldap_first_entry( ld, ures ))) { + if( ( val = ldap_get_values( ld, ue, "labeledURI" )) ) { + if(uri) ldap_value_free(uri); + uri = val; + + } + } + } + } + + for(i=0; uri && uri[i] && *uri[i]; i++) { + char *sp; + + if( ( sp = strchr(uri[i], ' ')) ) { + *sp++ = '\0'; + if(strstr(sp, glob->gw_switch->lagws)) { + flag = 1; + url = uri[i]; + break; + } else if(strstr(sp, GWS)) + urlnola = uri[i]; + } + } + } + + if(!flag && urlnola) { + url = urlnola; + flag = 1; + } + + if (glob->gw_switch) { + + for(gw_ptr = glob->gw_switch->list; + !flag && gw_ptr; gw_ptr = gw_ptr->next) { + if (!dn_cmp (dn2, gw_ptr->dn)) { + flag = 1; + url = gw_ptr->url; + } + } + } + + if(flag == 1) { + char *url_tmp; + + sprintf( href, "<LI><A HREF=\"%s\">%s</A>\n", + (url_tmp = url_complete(url, urldn, "M")), + glob->disp_sea_rdn ? rdn : ufn2); + + } + + if (flag==0) { + char *strptr; + + if(glob->strip_pin && strstr(glob->strip_pin, doc)) + if ( ( strptr = strchr(ufn2, ',')) ) { + + *strptr++ = '\0'; + trimright(ufn2, " 1234567890"); + sprintf(ufn2, "%s,%s", ufn2, strptr); + + } else + trimright(ufn2, " 1234567890"); + + ufn2 = trim(ufn2, "\""); + + /* TABLES DISPLAY CODE */ + if(glob->tables_marker){ + + char disp_rule[BUFSIZ], *strptr, strbuf[BUFSIZ]; + char tab_attr[BUFSIZ], percent[BUFSIZ]; + char **aval; + int n; + + strcpy(disp_rule, glob->tables_marker); + strptr = strstr(disp_rule, "persontable"); + + if(strptr){ + strptr = strchr(strptr, ':') + 1; + strcpy(disp_rule, strptr); + strptr = strchr(disp_rule, '$'); + if(strptr) *strptr = '\0'; + strcat(disp_rule, "&"); + + strcpy( href, "<TR>\n"); + + while(*disp_rule){ + strcpy(strbuf, disp_rule); + strptr=strchr(disp_rule, '&'); + strcpy(disp_rule, strptr+1); + + strptr=strchr(strbuf, '&'); + *strptr++ = '\0'; + strcpy(tab_attr, strbuf); + strptr = strchr(tab_attr, ','); + *strptr++ = '\0'; + strcpy(percent, strptr); + + sprintf( href, "%s <TD WIDTH=\"%s%%\" VALIGN=TOP %s>", + href, percent, + !strcasecmp(tab_attr, "telephonenumber") ? + "ALIGN=RIGHT NOWRAP" : "ALIGN=LEFT"); + + if(!strcasecmp(tab_attr, "rdn")){ + trimright (ufn2, " 1234567890"); + sprintf( href, "%s<A HREF=\"/M%s\">%s</A><BR>\n", + href, urldn, ufn2); + +#ifdef TUE_TEL + /* use tat_refphone & fallback to telephonenumber */ + } else if(!strcasecmp(tab_attr, "phone")){ + displayTueTelList( ld, e, href, glob ); + +#endif + } else if(!strncasecmp(tab_attr, "objectclass", 11)){ + char objectclass[BUFSIZ], letter[BUFSIZ], *trptr; + char tab_attr_buf[BUFSIZ]; + + *(letter+1) = *letter = '\0'; + strcpy(tab_attr_buf, tab_attr); + trptr = tab_attr_buf; + while( ( trptr = strchr(trptr, '=')) ) + *trptr++ = ' '; + + sscanf(tab_attr_buf, "%*s%s%s", + objectclass, letter); + if(!*letter) *letter = '*'; + + if( ( aval = + ldap_get_values( ld, e, "objectclass")) ) { + if(charray_inlist(aval, objectclass)) + sprintf(href, "%s %s", + href, letter); + } + } else if( ( aval = + ldap_get_values( ld, e, tab_attr )) ) { + for(n=0; aval[n]; n++){ + if(!strcasecmp(tab_attr, "mail")) + sprintf(href, + "%s<A HREF=\"mailto:%s\">%s</A><BR>", + href, aval[n], aval[n]); + else + sprintf(href, "%s %s<BR>", href, aval[n]); + } + } + sprintf( href, "%s</TD>", href); + } + sprintf( href, "%s</TR>", href); + } + + /* without tables */ + }else{ + sprintf( href, "<LI><A HREF=\"%s%sM%s\">%s</A>\n", + +#ifdef TUE_TEL + (glob->dit_config && !glob->dit_config->not_browse) ? + dn2server(urldn, glob) : "", +#else + "", +#endif + + "/", urldn, + glob->disp_sea_rdn ? rdn : ufn2); + } + } + + if (*sortstring == '&') { + + sortstring[0] = sortstring[1]; + sortstring[1] = 'e'; + + } + + if( (strstr(aoc, "person") && (s_ptr->dnLast >= glob->max_person) ) + || ( s_ptr->dnLast >= glob->maxcount) ) { + s_ptr->restricted = 1; + return; + } + + if ( sattr ) + temp = (char *) ch_malloc(strlen(*sattr)+strlen(sortstring)+1); + else + temp = (char *) ch_malloc(strlen(sortstring)+1); + if ( sattr ) + strcat(temp, *sattr); + strcat(temp,sortstring); + + if(!s_ptr->dnList) + s_ptr->dnList = (DNLIST **) ch_calloc(glob->maxcount+1, + sizeof(pDNLIST)); + if (!s_ptr->dnList[s_ptr->dnLast] ) + s_ptr->dnList[s_ptr->dnLast] = (pDNLIST) + ch_malloc(sizeof(DNLIST)); + + s_ptr->dnList[s_ptr->dnLast]->string = temp; + + if(glob->raw_data) { + s_ptr->dnList[s_ptr->dnLast]->raw = strdup(raw_string); + } + + s_ptr->dnList[s_ptr->dnLast++]->href = strdup(href); + glob->sorty[s_ptr->priority] = s_ptr; + + free( dn2 ); + ldap_value_free( s ); + ldap_value_free( oc ); + ldap_value_free( uri ); + + if(++counter >= glob->maxcount) + glob->restricted = TRUE; + +NEXTENTRY: + ; + return; +} +/* end of function: sort_parse */ + + +PUBLIC void close_ldap_connections(glob) +GLOB_STRUCT *glob; +{ + pLD_LIST ldlptr; + + for(ldlptr = glob->ld_list; ldlptr; ldlptr = ldlptr->next) + ldap_unbind(ldlptr->ld); +} +/* end of function: close_ldap_connections */ + +PUBLIC LDAP *get_ldap_connection( host, port, glob ) +char *host; +int port; +GLOB_STRUCT *glob; +{ + pLD_LIST ldlptr, *ldlhdl; + LDAP *ld = NULL; + int rc; + + for(ldlptr = glob->ld_list; ldlptr; ldlptr = ldlptr->next) { + if ( !strcasecmp(ldlptr->host, host) && (ldlptr->port == port)) + ld = ldlptr->ld; + + } + if (!ld) { + + if ( (ld = ldap_open( host, port )) == NULL ) + return(NULL); + if ( (rc=ldap_simple_bind_s( ld, glob->webdn, glob->webpw )) + != LDAP_SUCCESS ) + return(NULL); + for(ldlhdl = &glob->ld_list; *ldlhdl; ldlhdl = &(*ldlhdl)->next) + ; + *ldlhdl = (pLD_LIST) ch_calloc(1, sizeof(LD_LIST)); + (*ldlhdl)->host = strdup(host); + (*ldlhdl)->port = port; + (*ldlhdl)->ld = ld; + } + return(ld); +} +/* end of function: get_ldap_connection */ + + +PRIVATE void get_ref_attrs( ld1, dn, e1, glob ) +LDAP *ld1; +char *dn; +LDAPMessage *e1; +GLOB_STRUCT *glob; +{ + pIND_ATTRS i_ptr; + IND_ATTR_ARR *idx, **vnodes; + int i, j, k, n; + LDAP *ld; + int rc; + LDAPMessage *res, *e; + struct timeval timeout; + char **val, **val1; + char ref_dn[BUFSIZ], ref_cnbuf[BUFSIZ], *ref_cn; + + + for(i_ptr = glob->ind_attrs; i_ptr; i_ptr = i_ptr->next) { + + /* Function-Mode */ + if (i_ptr->ia_arr && (i_ptr->ia_arr[0].replace == 2)) + continue; + + if ( (val1 = ldap_get_values( ld1, e1, i_ptr->ref_attr )) == NULL ) + continue; + + for(idx = i_ptr->ia_arr, i=0; idx[i].key; i++){ + /* idx[i].key idx[i].replace idx[i].attr idx[i].host idx[i].port + idx[i].base -- i_ptr->ref_attr */ + + ld = get_ldap_connection( idx[i].host, idx[i].port, glob ); + + timeout.tv_sec = glob->timeout; + timeout.tv_usec = 0; + + for ( j = 0; val1[j] != NULL; j++ ) { + if(strncasecmp(val1[j], idx[i].key, strlen(idx[i].key))) + continue; + else { + strcpy(ref_cnbuf, val1[j]); +/* ref_cn = ref_cnbuf + strlen(idx[i].key); +*/ + ref_cn = ref_cnbuf; + } + + sprintf(ref_dn, "cn=%s,%s", ref_cn, idx[i].base); + if ( (rc = ldap_search_st( ld, ref_dn, LDAP_SCOPE_BASE, + "objectClass=*", NULL, 0, &timeout, &res )) != LDAP_SUCCESS ) + continue; + if ( (e = ldap_first_entry( ld, res )) == NULL ) + return; + val = ldap_get_values( ld, e, idx[i].attr ); + if(val[0] != NULL) { + if(!idx[i].e) + idx[i].e = ( LDAPMessage ** ) + ch_malloc( 16 * sizeof(LDAPMessage *) ); + for(n=0; idx[i].e[n]; n++) + ; + idx[i].e[n] = e; + idx[i].ld = ld; + vnodes = &glob->ind_attrs->valid_nodes; + if(!*vnodes) + *vnodes = (IND_ATTR_ARR *) + ch_malloc( 100 * sizeof(IND_ATTR_ARR *) ); + for(k=0; (*vnodes)[k].key; k++) + ; + if(j==0) + (*vnodes)[k] = idx[i]; + } + } + } + } +} +/* end of function: get_ref_attrs */ diff --git a/contrib/tweb/x500.h b/contrib/tweb/x500.h new file mode 100644 index 0000000000000000000000000000000000000000..fbab445ff39bdaf8d1cfb15c75fc6f9d4e281e29 --- /dev/null +++ b/contrib/tweb/x500.h @@ -0,0 +1,61 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* x500.h..... * +* * +* Function:..Header-File for TWEB-Software * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* February 13 1996 Z D D V V * +* Last modification: Z D D V V * +* February 18 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: x500.h,v 1.6 1999/09/10 15:01:21 zrnsk01 Exp $ + * + */ + +#ifndef _X500_ +#define _X500_ + +#include "x500_exp.h" +#include "charray_exp.h" +#include "ch_malloc_exp.h" + +typedef LDAPMessage *(*LFP)(); + +typedef struct _my_ldap_list { + LDAPMessage *e; + struct _my_ldap_list *next; +} MY_LDAP_LIST, *pMY_LDAP_LIST; + +pMY_LDAP_LIST mllroot = NULL; + +PRIVATE int compare(/*a,b*/); +PRIVATE char * pick_oc(/*oclist*/); +PRIVATE int make_scope(/*ld, dn, glob*/); +PRIVATE int no_show(/* rdn, glob*/); +PRIVATE int sort_result(/*ld, res, dn, no_browse, glob*/); +PRIVATE void list_output(/*fp, flag, glob*/); +PRIVATE void make_la_buttons(/*sep, fp, dn, la_url, glob*/); +PRIVATE void make_la_buttons_pull_down(/*sep, fp, dn, la_url, glob*/); +PRIVATE void print_rdn(/*fp, dn, glob*/); +PRIVATE void print_rdn_pull_down(/*fp, dn, glob*/); +PRIVATE void make_search_box(/*fp, ld, dn, glob*/); +PRIVATE LDAPMessage *my_first_entry(); +PRIVATE LDAPMessage *my_next_entry(); +PRIVATE LDAPMessage *ldap_list_eval(); +PRIVATE void sort_parse(); +PRIVATE void get_ref_attrs(); +PRIVATE void disp_form_button(); + + +#endif /* _X500_ */ diff --git a/contrib/tweb/x500_exp.h b/contrib/tweb/x500_exp.h new file mode 100644 index 0000000000000000000000000000000000000000..318d97ae06f0b23005be8129ba43a01f25a97f44 --- /dev/null +++ b/contrib/tweb/x500_exp.h @@ -0,0 +1,40 @@ +/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ +* * +* x500_exp.h. * +* * +* Function:..Header-Datei fuer TWEB-Software * +* * +* * +* * +* Authors:...Dr. Kurt Spanier & Bernhard Winkler, * +* Zentrum fuer Datenverarbeitung, Bereich Entwicklung * +* neuer Dienste, Universitaet Tuebingen, GERMANY * +* * +* ZZZZZ DDD V V * +* Creation date: Z D D V V * +* February 13 1996 Z D D V V * +* Last modification: Z D D V V * +* January 10 1999 ZZZZ DDD V * +* * +_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/ + +/* + * $Id: x500_exp.h,v 1.6 1999/09/10 15:01:21 zrnsk01 Exp $ + * + */ + +#ifndef _X500_EXP_ +#define _X500_EXP_ + +PUBLIC void do_menu(/*ld, fp, dn, glob*/); +PUBLIC void do_xtend(/*ld, fp, dn, glob*/); +PUBLIC int do_search(/*ld, fp, query, glob*/); +PUBLIC void do_read(/*ld, fp, dn, amore, glob*/); +PUBLIC void do_form(/*ld, fp, query, glob*/); +PUBLIC void do_modify(/*ld, fp, query, glob*/); +PUBLIC char * make_oc_to_string(/*oc*/); +PUBLIC LDAP *get_ldap_connection( /* host, port, glob */ ); +PUBLIC void close_ldap_connections(); + + +#endif /* _X500_EXP_ */